2014-12-07 54 views
0

我有2个实体,用户和材料。用户持有材料的收集。正在更新导航属性,但实体没有出现在集合中

public class User 
{ 
... 

private ICollection<Material> materials; 

     public virtual ICollection<Material> Materials 
     { 
      get { return materials ?? (materials = new List<Material>()); } 
      set { materials = value; } 
     } 
} 

和材质:

public class Material 
    { 
... 
     public int? UserId { get; set; } 
     public virtual User User { get; set; } 
... 
    } 

身份登录时,用户选择材料,我为该用户分配到Material.User并保存更改。工作正常,更改保存在分贝。但是,如果我想使用User.Materials访问材质,集合不包含任何元素。我已经尝试过简单的项目,它在那里工作。有了我复杂的项目,事实并非如此。该怎么办?

请帮助我,困扰已经8个小时的问题,而且还没有修复它。

编辑:那么,那是......跛脚。

我的代码实际上正在工作,但是...问题是,当查看用户的详细信息时,我从数据库中检索到用户,并使用一个压缩器创建了一个COPY。我错过了一些东西:

public User(User otherUser) 
     { 
      Id = otherUser.Id; 
      FirstName = otherUser.FirstName; 
      LastName = otherUser.LastName; 
      Shift = otherUser.Shift; 
      PassCode = otherUser.PassCode; 
      Type = otherUser.Type; 

      Materials = otherUser.Materials; // this line was missing 
     } 

添加此行后,它的工作原理。只是Visual Studio抱怨(构造函数中的虚拟成员调用)。该怎么办?

+0

你已经删除了太多的代码。没有关于你的问题。 – t3chb0t 2014-12-07 20:56:41

+0

没有其他东西可以显示。当我选择材料,我打电话当前登录的用户的方法,其中规定材料的使用者属性,像这样: '公共无效SetBoxAsUnused(材料材料,用户用户) { material.User =用户 context.SaveChanges( ); }' – Orochi 2014-12-07 21:06:00

+0

“构造函数中的虚拟成员调用”只是一个警告。如果在子类中覆盖了“材质”(例如代理!),则可能会得到[意外结果](http://stackoverflow.com/a/119543/861716)。解决方案是将'otherUser.Materials'赋给'materials'(成员变量,顺便说一句,你可能想根据常见的命名规则命名'_materials')。 – 2014-12-07 21:58:36

回答

0

你的问题在这里:

private ICollection<Material> materials; 

    public virtual ICollection<Material> Materials 
    { 
     get { return materials ?? (materials = new List<Material>()); } 
     set { materials = value; } 
    } 

实体框架导航属性不能与支持字段属性。它只能是自动属性。所以你应该使用这个代码:

public class User 
{ 
... 

     public virtual ICollection<Material> Materials 
     { 
      get; 
      set; 
     } 
} 
+0

我得到与自动属性相同的结果。 – Orochi 2014-12-07 21:04:57

+0

您是否使用延迟加载?当您尝试查看导航属性时,是否打开了dbcontext?当您在导航属性中得到空值时,从数据库和代码获取数据时向我们显示代码。 – 2014-12-07 21:07:03

+0

我正在使用延迟加载。它适用于我的项目中的每个1:M关系,问题仅在这两个关系之间退出,我稍后设置导航属性。 无论如何,要检索用户:'return context.Users.Find(id);' 工作得很好,只是集合是空的。 这里我得到null异常: '//MessageBox.Show(User.Materials.Count.ToString());;˙˙, 此外,我将这个集合绑定到列表框,但是是offcourse空的。 – Orochi 2014-12-07 21:12:05