コレクションを含むエンティティはコレクションに特定のルールを適用する必要があるため、ドメインをより適切にカプセル化するために、非公開プロパティを持つエンティティのコレクションをマップしようとしています。
public class Foo
{
public AddBar(Bar bar)
{
if (BarsInternal.Count > 4)
{
throw new Exception("Too many Bars!");
}
BarsInternal.Add(bar);
}
public IEnumerable<Bar> Bars
{
get { foreach (var bar in BarsInternal) { yield return bar; } }
}
internal virtual IList<Bar> BarsInternal { get; set; }
}
非コレクションプロパティの場合、これまでは、プロパティを内部にInternalsVisibleTo
し、マッピングクラスを使用してプロパティを通常どおりにマッピングする(エンティティフレームワークがドメインモデルと同じアセンブリにない場合に適用する)ことでこれを行うことができました。
ただし、コレクションの場合、これを機能させることができないようです。プロパティをパブリックとしてマークし、次のマッピングを使用する場合:
public class FooMap : EntityTypeConfiguration<Foo>
{
public FooMap()
{
this.HasMany(x => x.BarsInternal);
}
}
その後、すべてが機能します。
ただし、Bars
プロパティを内部に変更すると、次の奇妙な動作が発生します。
context.Foos.AddOrUpdate(fooInstance)
したCodeFirst MigrationsはBars
、予想どおり、データベース内のコレクションを完全に永続化します。Foo
コンテキストからを取得する場合、Bars
コレクションは常に空です。Entity Framework Code Firstで非公開のコレクションプロパティを正しくマップするにはどうすればよいですか?
のアクセス修飾子をBarsInternal
からinternal
に変更するprotected internal
と、正しく機能します。
この理由は、エンティティフレームワークがコレクションのバックグラウンドでプロキシを使用し、プロキシがコレクションプロパティをオーバーライドできる場合にのみ、コレクションプロパティを「シャドウ」できるためだと思います。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加