2013-11-27 39 views
1

我是EF新手,我和我的孩子有一點麻煩。我可以保存一個實體對象的實例,但是當我嘗試保存與該實體相關聯的子代時,它會炸燬我。 enter image description here實體框架保存子女

我目前正在使用的模型。

public bool UpdateSelectedUser(user selectedUser) 
    { 
     nsdc_supplyEntities ctx = new nsdc_supplyEntities(); 

     try 
     { 
      user editUser = ctx.users 
       .Include(ug => ug.network_group) 
       .Where(u => u.id == selectedUser.id).FirstOrDefault(); 

      editUser.full_name = selectedUser.full_name; 
      editUser.office_phone = selectedUser.office_phone; 
      editUser.cell_phone = selectedUser.cell_phone; 
      editUser.home_phone = selectedUser.home_phone; 
      editUser.text_address = selectedUser.text_address; 
      editUser.email = selectedUser.email; 

      foreach (network_group group in selectedUser.network_group) 
      { 
       editUser.network_group.Add(group); 
      } 

      ctx.SaveChanges(); 
     } 
     catch (Exception e) 
     { 
     } 
    } 

我正在使用的代碼。在editUser.network_group.Add(group);行中出現錯誤,表示「兩個對象之間的關係無法定義,因爲它們連接到不同的ObjectContext對象」。我已經在Google和SO上挖掘了一些潛在的答案,但到目前爲止還沒有找到任何解決問題的方法。

-UPDATE- 更改了組foreach以反映Shyju的建議。它讓我走得更遠,但暴露了另一個問題:

  foreach (network_group group in selectedUser.network_group) 
      { 
       var groupEntity = new network_group 
       { 
        id = group.id, 
        full_name = group.full_name, 
        distribution_list_email = group.distribution_list_email 
       }; 
       if (editUser.network_group.Where(g => g.id == groupEntity.id).Count() < 1) 
       { 
        editUser.network_group.Add(groupEntity); 
       } 
      } 

有一個引發錯誤的唯一約束。我注意到我插入了一些重複的條目。所以現在如果用戶已經擁有一個組,它就不會添加它。不過,現在我只添加了當前沒有與用戶關聯的組,但我仍然收到一個唯一的約束錯誤。我發現的是,它現在將新組添加到組表中,然後將其與用戶相關聯。我想將現有的組添加到用戶,而不是創建一個新的組。越來越近! :)

+0

至於你的第一句話,我指的是parenting.stackexchange.com :) –

回答

1

原始錯誤的發生是因爲您正在添加的實體已經在不同的上下文中創建到剛剛創建的上下文中的實體。

// Get the ids 
var userGroupIds = selectedUser.network_groups.Select(e => e.id); 

// Use the ids to retrieve their equivalent entities from the new context 
var userGroups = ctx.network_groups.Where(e => userGroupIds.Contains(e.id)); 

// Add the groups from the correct context. 
foreach (network_group group in userGroups) 
{ 
    editUser.network_group.Add(group); 
} 
1

我想這可能會解決這個問題。創建新的network_group1對象並設置屬性值並將其添加到集合中。

foreach (network_group group in selectedUser.network_group) 
{ 
    var groupEntity=new network_group { id=group.id,full_name=group.ful_lname 
         ,distribution_list_email=group.distribution_list_email}; 
    editUser.network_group.Add(groupEntity); 
} 
ctx.SaveChanges(); 
+0

似乎很奇怪,我需要創建組的另一個實例,當我有一個手中。它不再在該行上發生錯誤,但請參閱OP中的更新以瞭解新問題的描述。我想知道是否因爲我正在創建一個試圖創建新組的組的新實例。 – Jeremy

0

最簡單的方法是確保selectedUser(因此它的network_group)沒有連接到當前屬於上下文。然後,可以將組添加到新的editUser中,就像在原始代碼中一樣。