C# 实体框架-导航属性未保存
我很难让我的导航属性首先在EF代码中工作。作为一个抽象的例子,我有:C# 实体框架-导航属性未保存,c#,asp.net-mvc,asp.net-mvc-4,entity-framework-5,lazy-loading,C#,Asp.net Mvc,Asp.net Mvc 4,Entity Framework 5,Lazy Loading,我很难让我的导航属性首先在EF代码中工作。作为一个抽象的例子,我有: public class Parent{ public int ParentID {get; set;} public virtual List<NamedChild> Children {get; set;} public Parent(){} public void Init(int ParentID, List<UnnamedChild> Children){
public class Parent{
public int ParentID {get; set;}
public virtual List<NamedChild> Children {get; set;}
public Parent(){}
public void Init(int ParentID, List<UnnamedChild> Children){
this.ParentID = ParentID;
this.Children = Children.ConvertAll(x => new NamedChild(x, ""));
}
}
public class NamedChild{
public int ChildID {get; set;}
public string Name {get; set;}
public NamedChild(UnnamedChild c, string Name){
this.ChildID = c.ChildID;
this.Name = Name;
}
}
public class UnnamedChild{
public int ChildID {get; set;}
public UnnamedChild(int ChildID){
this.ChildID = ChildID;
}
}
公共类父类{
public int ParentID{get;set;}
公共虚拟列表子项{get;set;}
公共父项(){}
public void Init(int ParentID,列出子项){
this.ParentID=ParentID;
this.Children=Children.ConvertAll(x=>newnamedchild(x,”);
}
}
公共类命名儿童{
public int ChildID{get;set;}
公共字符串名称{get;set;}
public NamedChild(未命名的child c,字符串名){
this.ChildID=c.ChildID;
this.Name=Name;
}
}
公共类未命名儿童{
public int ChildID{get;set;}
公共未命名子对象(int-ChildID){
this.ChildID=ChildID;
}
}
然后后来
List<UnnamedChild> children = GetChildrenFromSomewhere();
Parent p = db.Parents.Create();
p.Init(1, children);
db.Parents.Add(p);
db.SaveChanges();
List children=getchildrenfromwhere();
父p=db.Parents.Create();
p、 Init(1,儿童);
db.Parents.Add(p);
db.SaveChanges();
现在,如果我正在调试,我可以查看当前的DbSet,它显示有一个父对象,它的“Children”属性设置为一个包含2个NamedChild的列表。这很好,这就是它应该是的。但是,如果我停止程序并重新运行它,当我在DbSet中查找时,仍然有一个父级,但是它的“Children”属性被设置为null
总之,在保存后,这些值立即正确,但只要我重新加载DB上下文,这些值就会丢失(空值)。我正在运行最近启用LazyLoading的EF
应该注意的是,如果我使用.Include(),它将用正确的NamedChild列表填充这些空值,但我需要它来处理LazyLoading。虽然我认为这在技术上并不重要,但我注意到EF似乎更喜欢
ICollections
而不是其他列表/数组类型。尝试:
public virtual ICollection<NamedChild> Children {get; set;}
我认为EF可能无法为
NamedChild
对象创建代理,因此无法执行任何延迟加载
创建代理类的一个要求是,POCO必须有一个不带参数的公共/受保护的构造函数
这可能会解决您的问题:
public class NamedChild
{
public int ChildID {get; set;}
public string Name {get; set;}
protected NamedChild() {}
public NamedChild(UnnamedChild c, string Name)
{
this.ChildID = c.ChildID;
this.Name = Name;
}
}
我相信您已经满足了延迟加载代理的所有其他要求
此处的完整要求:
的确如此。不过,这不会有什么不同。
public class NamedChild
{
public int ChildID {get; set;}
public string Name {get; set;}
protected NamedChild() {}
public NamedChild(UnnamedChild c, string Name)
{
this.ChildID = c.ChildID;
this.Name = Name;
}
}