如何使用Entity Framework Code First映射非公共Collection属性?

时间:2014-01-11 12:13:22

标签: c# entity-framework entity-framework-6

我正在尝试使用非公共属性映射实体集合,以便更好地封装我的域,因为包含集合的实体需要对集合强制执行某些规则,例如

  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中正确映射非公共集合属性?

1 个答案:

答案 0 :(得分:3)

BarsInternal的访问修饰符从internal更改为protected internal,它将正常运行。

我怀疑这样做的原因是实体框架在场景后面使用代理集合,并且代理只能在它们覆盖它时“遮蔽”集合属性。