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

App*_*ere 14 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; }
}
Run Code Online (Sandbox Code Playgroud)

然后我添加一个新用户:

public User Add(User user)
{
    var addedUser = _myContext.Users.Add(user);
    myContext.SaveChanges();
    return addedUser;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

提前感谢任何想法.

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

Enr*_*lio 20

这是因为DbSet.Add方法返回已作为参数传递给它的同一对象,在您的情况下,它不是代理实例,因此延迟加载不可用.

您应该使用DbSet.Create方法创建User传递给DbSet.Add的对象,该方法将返回代理实例,然后在通过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;
}
Run Code Online (Sandbox Code Playgroud)

  • 完善.解决了我的问题 - 非常感谢.为了复制用户属性,我在SaveChanges()之前添加了一行:_myContext.Entry(newUser).CurrentValues.SetValues(user); 似乎工作正常. (7认同)