2013-07-29 108 views
0

我有一組表(ConditionTemplate和KeyWord),它們具有多對多的關係。在代碼中,我試圖將關鍵字添加到特定的ConditionTemplate記錄。不幸的是,當我認爲我將關鍵字添加到特定條件時,我收到了錯誤,好像它添加了新的關鍵字而未與條件關聯。保存到具有多對多關係的實體

我的模型的圖像: enter image description here

我的代碼:

全局變量創建:

EnterpriseEntities EE; 
    ConditionTemplate myConditionTemplate; 

加載全局變量:

  EE = new EnterpriseEntities(); 
      EE.Database.Connection.ConnectionString = Myapp.EnterpriseEntityConnectionString; 

      myConditionTemplate = EE.ConditionTemplates.Where(c => c.TemplateCode == "17D").FirstOrDefault(); 

上面的代碼加載單個條件與許多關鍵字。

可用關鍵字在列表框中,用戶按下按鈕以選擇關鍵字以移至該條件。這是處理該問題的代碼。

   foreach (KeyWord SelectedKeyWord in ListBoxAvailableKeyWords.SelectedItems) 
       { 



        KeyWord NewKeyWord = new KeyWord 
        { 
         KeyWordID = SelectedKeyWord.KeyWordID, 
         ID = SelectedKeyWord.ID, 
         Word = SelectedKeyWord.Word 

        }; 

        myConditionTemplate.KeyWords.Add(NewKeyWord); 



       } 

然後用戶按下一個按鈕來保存更改,我叫

EE.SaveChanges 

然後我得到這個錯誤:

System.Data.UpdateException: An error occurred while updating the entries. See the inner exception for details. ---> System.Data.SqlClient.SqlException: Violation of UNIQUE KEY constraint 'IX_KeyWord'. Cannot insert duplicate key in object 'dbo.KeyWord'. The duplicate key value is (ADJUDICATION). The statement has been terminated.

如果我刪除,設置字屬性的代碼( Word = SelectedKeyWord.Word )當我創建關鍵字對象我得到這個錯誤。

System.Data.Entity.Validation.DbEntityValidationException: Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.

這告訴我字段是必需的。

回答

1

爲了告訴你已經選擇了KeyWord S IN數據庫中存在EF,避免必須將它們附加到上下文的問題:

foreach (KeyWord SelectedKeyWord in ListBoxAvailableKeyWords.SelectedItems) 
{ 
    KeyWord NewKeyWord = new KeyWord 
    { 
     // You actually only need to set the primary key property here 
     ID = SelectedKeyWord.ID 
    }; 

    EE.KeyWords.Attach(NewKeyWord); 
    myConditionTemplate.KeyWords.Add(NewKeyWord); 
} 

編輯

如果KeyWord實體已經附加到你的上下文中(因爲它們之前已經加載了相同的上下文),你可以使用:

foreach (KeyWord SelectedKeyWord in ListBoxAvailableKeyWords.SelectedItems) 
{ 
    KeyWord NewKeyWord = EE.KeyWords.Find(SelectedKeyWord.ID); 
    myConditionTemplate.KeyWords.Add(NewKeyWord); 
} 
+0

不,我得到這個錯誤。 ObjectStateManager中已存在具有相同鍵的對象。 ObjectStateManager不能使用同一個鍵跟蹤多個對象。 – Tyddlywink

+0

我的意思現在我得到這個錯誤。對不起,錯字。走了5分鐘,我無法編輯它。希望澄清,因爲目前的聲明聽起來很粗魯。 :D – Tyddlywink

+0

@Tyddlywink:你可以在調試器中檢查上述循環中的ID是否都是唯一的?或者在foreach循環之前添加一行:'bool idsUnique = ListBoxAvailableKeyWords.SelectedItems.Select(i => i.ID).Distinct()。Count()== ListBoxAvailableKeyWords.SelectedItems.Count();'然後檢查' idsUnique'爲'true'或'false'。 – Slauma

相關問題