我正在尝试使用非公共属性映射实体集合,以便更好地封装我的域,因为包含集合的实体需要对集合强制执行某些规则,例如
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,并使用以下映射:
public class FooMap : EntityTypeConfiguration<Foo>
{
public FooMap()
{
this.HasMany(x => x.BarsInternal);
}
}
然后,一切正常。
但是,如果我将Bars
属性更改为内部属性,那么我会得到以下奇怪的行为:
context.Foos.AddOrUpdate(fooInstance)
的代码优先迁移会按预期在数据库中完全保留Bars
集合。Foo
时,Bars
集合始终为空。如何在Entity Framework Code First中正确映射非公共集合属性?
答案 0 :(得分:3)
将BarsInternal
的访问修饰符从internal
更改为protected internal
,它将正常运行。
我怀疑这样做的原因是实体框架在场景后面使用代理集合,并且代理只能在它们覆盖它时“遮蔽”集合属性。