我有一个父对象和子对象。如果我做以下
Child c = new Child();
c.ParentID = parentID;
context.Child.Add(c);
context.SaveChanges();
int i = c.Parent.ParentID; // throws an exception b/c Parent is null
为什么这样做?如果我得到一个新的上下文(保存后),我可以看到Parent就好了。
答案 0 :(得分:9)
我猜你正在使用延迟加载。如果您希望在将具有外键属性的对象添加到上下文后填充导航属性,则必须使用Create
的{{1}}方法(而不是使用DbSet
实例化对象) :
new
使用活动延迟加载,这将创建一个代理对象,以确保加载导航属性。
答案 1 :(得分:0)
在提问后有点晚,只是为了澄清。如MS文档所述here,我改用它:
using (var context = new BloggingContext())
{
var post = context.Posts.Find(2);
// Load the blog related to a given post.
context.Entry(post).Reference(p => p.Blog).Load();
// Load the blog related to a given post using a string.
context.Entry(post).Reference("Blog").Load();
var blog = context.Blogs.Find(1);
// Load the posts related to a given blog.
context.Entry(blog).Collection(p => p.Posts).Load();
// Load the posts related to a given blog
// using a string to specify the relationship.
context.Entry(blog).Collection("Posts").Load();
}
但是仅当您使用Add()方法时,它将起作用
context.Set<T>().Add(post);
context.SaveChanges();
context.Entry(post).Reference(p => p.Blog).Load();
它不适用于.AddRange()