添加的代码优先实体不是延迟加载属性

时间:2012-02-13 14:05:53

标签: entity-framework lazy-loading code-first

我遇到一个问题,即如果在添加实体后立即需要,则新添加的实体的属性不会延迟加载。

例如:

我有一个具有虚拟JobRole属性的User实体:

public class User
{
    public int Id { get; set; }

    public virtual JobRole JobRole { get; set; }
    public int JobRoleId { get; set; }

    public string Name { get; set; }
}

然后我添加了一个新用户:

public User Add(User user)
{
    var addedUser = _myContext.Users.Add(user);
    myContext.SaveChanges();
    return addedUser;
}

然后将返回的对新用户的引用传递给Razor视图,在该视图中它尝试显示JobRole(例如JobRole.Name)。在将User传递给View时,它具有:

  • JobRoleId正确设置为整数值。
  • JobRole = null

我希望JobRole在被View使用时会延迟加载,但它不会导致null引用异常。

这是预期的行为,还是有办法让新添加的实体延迟加载其属性?

提前感谢任何想法。

环境: 使用Entity Framework 4.2代码优先。 启用了延迟加载。

2 个答案:

答案 0 :(得分:20)

那是因为DbSet.Add方法返回与作为参数传递给它的相同对象,在您的情况下,它不是代理实例,因此延迟加载不可用。< / p>

您应该使用DbSet.Add方法创建传递给DbSet.CreateUser对象,该方法将返回代理实例,然后分配其属性在通过DbContext持久化之前。

以下是一个例子:

public User Add(User user)
{
    var newUser = _myContext.Users.Create();

    // Copy the property values from 'user' to 'newUser' e.g.
    // newUser.Name = user.Name

    _myContext.Users.Add(newUser);
    myContext.SaveChanges();

    return newUser;
}

答案 1 :(得分:1)

您可以尝试两件事,第一件事就是强制执行急切加载:

context.ContextOptions.LazyLoadingEnabled = false;

如果这不起作用,您可以使用以下方法加载属性:http://msdn.microsoft.com/en-us/library/dd382880.aspx