2014-12-07 61 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

相關問題