gpt4 book ai didi

c# - 如何使用 Entity Framework Code First 映射非公共(public)集合属性?

转载 作者:行者123 更新时间:2023-11-30 22:10:09 24 4
gpt4 key购买 nike

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

  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; }

}

对于非集合属性,我过去能够通过将属性设置为内部属性并简单地照常映射属性(当 Entity Framework 不在同一个框架中时应用 InternalsVisibleTo 来做到这一点程序集作为域模型)使用映射类。

但是,对于集合,我似乎无法让它发挥作用。如果我将属性标记为公开,并使用以下映射:

public class FooMap : EntityTypeConfiguration<Foo>
{
public FooMap()
{
this.HasMany(x => x.BarsInternal);
}
}

然后,一切正常。

但是,如果我将 Bars 属性更改为内部属性,则会出现以下奇怪的行为:

  • 数据库表按预期创建(使用代码优先迁移),并且外键和所有内容都对齐,因此显然 Entity Framework 正在以某种方式读取内部属性
  • 使用 context.Foos.AddOrUpdate(fooInstance) 的代码优先迁移确实如预期的那样将 Bars 集合完全保留在数据库中。
  • 但是,当从上下文中检索 Foo 时,Bars 集合始终为空。<

如何在 Entity Framework Code First 中正确映射非公共(public)集合属性?

最佳答案

BarsInternal 的访问修饰符从 internal 更改为 protected internal 它将正常工作。

我怀疑这是因为 Entity Framework 在后台使用代理来收集集合,如果代理可以覆盖集合属性,则代理只能“隐藏”集合属性。

关于c# - 如何使用 Entity Framework Code First 映射非公共(public)集合属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21062085/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com