我没有能够专门找到这个问题的其他人,所以这里有。
我有一个简单的模型,其中一个实体只是引用另一个实体作为父子或一对多关系定义如下:
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);
最后,我有一些限制:
答案 0 :(得分:4)
我终于明白了。经过多次试验和错误后,我注意到有一个无参数构造函数标记为内部,EF无法创建其类型的动态代理类,因此禁用所有延迟加载。我有两个构造函数,一个用于EF来水合对象,另一个用参数需要调用者来创建我的实体。一旦我将签名更改为受保护的内部,它就开始工作了。所以我改变了这个:
internal Child() {}
到
protected internal Child() {}
答案 1 :(得分:0)
可能是你没有启用延迟加载。试试这个,
Context.Set<Child>().FirstOrDefault(x => x.ID == 1).Include(c=>c.Parent);