Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架-导航属性未保存_C#_Asp.net Mvc_Asp.net Mvc 4_Entity Framework 5_Lazy Loading - Fatal编程技术网

C# 实体框架-导航属性未保存

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){

我很难让我的导航属性首先在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){
        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;
    }
}