2012-02-13 98 views
14

我有一个问题,即新添加的实体的属性不是延迟加载,如果需要在添加实体后立即添加。添加代码优先实体不延迟加载属性

例如:

我有一个虚拟JobRole属性的用户实体:

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)。在用户传递到视图时,它具有:

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

那么我希望JobRole偷懒加载,通过查看使用时,但它是不是和导致空引用异常。

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

在此先感谢您的任何想法。

环境: 使用实体框架4.2代码优先。 启用延迟加载。

+0

我有这个问题,答案是正确的。但是,我的代码首先使用数据库。所以我建议你编辑标题,以便将来的搜索更容易登陆。 – 2015-07-26 09:15:31

回答

20

这是因为:

context.ContextOptions.LazyLoadingEnabled = false; 

如果这不起作用,你可以使用这个加载属性DbSet.Add方法返回相同已传递给它作为参数的对象,在您的情况下它不是代理实例,因此延迟加载不可用。

你应该使用DbSet.Create方法,该方法将返回代理实例,然后通过DbContext坚持前转让其性能打造了被传递到DbSet.AddUser对象。

下面是一个例子:

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; 
} 
+7

完美。解决了我的问题 - 非常感谢。要复制用户属性,我只需在SaveChanges()之前添加一行:_myContext.Entry(newUser).CurrentValues.SetValues(user);似乎工作正常。 – Appetere 2012-02-13 14:43:36

+0

@Steve更好。我很高兴我可以帮助:) – 2012-02-13 14:55:18

1

您可以尝试两件事情,第一个是执行急切加载:http://msdn.microsoft.com/en-us/library/dd382880.aspx

+0

感谢您花时间回答我的问题。但是,关闭延迟加载并不会使所有内容都急切加载 - 您只需在检索项时应用“包含”语句,而不是添加它们。我可以手动加载属性,但我真的想明白为什么这不会自动发生。 – Appetere 2012-02-13 14:21:12

+0

随时。别客气。 =) – 2012-02-13 14:23:23

+0

嗯,可能是因为你没有使用include方法实施加载。如果您的上下文是延迟加载的,则该类的关系属性将被加载,因为它是您实体的属性,但实际上该关系的属性不会。 – 2012-02-13 14:28:21