我遇到一个问题,即如果在添加实体后立即需要,则新添加的实体的属性不会延迟加载。
例如:
我有一个具有虚拟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时,它具有:
我希望JobRole在被View使用时会延迟加载,但它不会导致null引用异常。
这是预期的行为,还是有办法让新添加的实体延迟加载其属性?
提前感谢任何想法。
环境: 使用Entity Framework 4.2代码优先。 启用了延迟加载。
答案 0 :(得分:20)
那是因为DbSet.Add方法返回与作为参数传递给它的相同对象,在您的情况下,它不是代理实例,因此延迟加载不可用。< / p>
您应该使用DbSet.Add方法创建传递给DbSet.Create的User
对象,该方法将返回代理实例,然后分配其属性在通过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