【问题标题】:EF code first related entities not loading at allEF 代码优先相关实体根本不加载
【发布时间】:2012-05-09 07:49:26
【问题描述】:

我无法找到专门解决此问题的其他人,所以就这样吧。

我有一个简单的模型,其中一个实体简单地将另一个实体引用为父子关系或一对多关系,定义如下:

public class Parent
{
    public int ID { get; private set; }
    public string Name { get; private set; }
}

public class Child
{
    public int ID { get; private set; }
    public string Name { get; private set; }
    public virtual Parent Parent { get; private set; }
}

我正在为每个创建特定的映射文件,这些文件对除相关实体之外的所有正常属性都非常有用。它总是出现空值。无论我是否在属性上有虚拟/私有访问器,它都不会加载,除非我先从上下文中单独提取父级的副本。我的映射如下所示:

HasRequired(t => t.Parent).WithMany().Map(t => t.MapKey("ParentID")).WillCascadeOnDelete();

这有什么我做错了吗?我一生都无法弄清楚这一点。就这样我涵盖了所有基础,我正在加载这样的实体:

Context.Set<Child>().FirstOrDefault(x => x.ID == 1);

最后,我有一些限制:

  1. 我不能将模型中的外键作为属性。
  2. 我不能从父母那里收集孩子。

【问题讨论】:

  • 为我工作。孩子由您的查询加载,child.Parent 在第一次访问时延迟加载。
  • 为什么有两个类来代表孩子和父母。因为它们具有相同的属性
  • @Jayantha 也许这只是示例代码...

标签: entity-framework mapping foreign-keys ef-code-first


【解决方案1】:

可能是你没有开启延迟加载。试试这个,

Context.Set<Child>().FirstOrDefault(x => x.ID == 1).Include(c=>c.Parent);

【讨论】:

  • 这似乎奏效了,但我不明白为什么根本没有启用延迟加载。我取消了属性的虚拟部分,甚至确保我在上下文中将其指定为启用,如下所示:Configuration.LazyLoadingEnabled = true;
  • 开启延迟加载需要有虚拟属性,需要开启代理创建。
  • 做到了,但没有奏效。原来是无参构造函数,见我上面的回答。
【解决方案2】:

我终于明白了。经过多次试验和错误,我注意到将无参数构造函数标记为内部,EF 无法创建您的类型的动态代理类,因此禁用所有延迟加载。我有两个构造函数,一个用于 EF 水合对象,另一个带有参数要求调用者创建我的实体。一旦我将签名更改为受保护的内部,它就开始工作了。所以我改变了这个:

internal Child() {}

protected internal Child() {}

【讨论】:

  • 那么你在这里放了一个不同的代码:)。请更新您的问题。
  • 说真的......发布真实代码是获得答案的关键,许多阅读此问题的人会立即发现这一点,并在您将其包含在问题中时给您答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多