我很难让我的导航属性在 EF Code First 中工作。作为一个抽象的例子,我有:
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;
}
}
然后后来...
List<UnnamedChild> children = GetChildrenFromSomewhere();
Parent p = db.Parents.Create();
p.Init(1, children);
db.Parents.Add(p);
db.SaveChanges();
现在,如果我正在调试,我可以查看当前的 DbSet,它显示有 1 个 Parent,并且它的“Children”属性设置为 2 个 NamedChild 的列表。这很好,这是应该的。但是,如果我停止程序并重新运行它,当我查看 DbSet 时,仍然有 1 个 Parent,但它的“Children”属性已设置为 null。
总而言之,保存后立即值是正确的,但是一旦我重新加载数据库上下文,这些值就会丢失(空值)。我正在运行启用了 LazyLoading 的最新 EF。
应该注意的是,如果我使用 .Include(),它将使用正确的 NamedChild 列表填充那些空值,但我需要它来使用 LazyLoading。