插入后的延迟加载属性

时间:2011-06-10 23:20:19

标签: entity-framework

我有一个父对象和子对象。如果我做以下

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就好了。

2 个答案:

答案 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()