2012-03-13 43 views
1

當我運行下面的代碼時,出現此錯誤Cannot add an entity with a key that is already in use.無法添加使用已使用密鑰的實體(LINQ)

表: enter image description here

我在想什麼?

private void CopyAllPageObjects(int fromPageID, int toPageID) 
    { 
     CMSDataContext _db = new CMSDataContext(); 

     // Copy page objects 
     var originalPageObjects = (from x in _db.CMSPageObjects 
            where x.PageID == fromPageID 
            select x); 

     List<CMSPageObject> newPageObjects = new List<CMSPageObject>(); 
     foreach (CMSPageObject po in originalPageObjects) 
     { 
      CMSPageObject newPageObject = new CMSPageObject(); 
      newPageObject.PageID = toPageID; 
      newPageObject.CMSObjectID = po.CMSObjectID; 
      newPageObject.Name = po.Name; 
      newPageObject.Sorting = po.Sorting; 
      newPageObjects.Add(newPageObject); 

      // Copy page object attribute values 
      var originalPoavs = (from x in _db.CMSPageObjectAttributeValues 
           where x.CMSPageObjectID == po.ID 
           select x); 

      List<CMSPageObjectAttributeValue> newPoavs = new List<CMSPageObjectAttributeValue>(); 
      foreach (CMSPageObjectAttributeValue poav in originalPoavs) 
      { 
       CMSPageObjectAttributeValue newPoav = new CMSPageObjectAttributeValue(); 
       newPoav.CMSAttributeID = poav.CMSAttributeID; 
       newPoav.CMSPageObjectID = newPageObject.ID; 
       newPoav.LCID = poav.LCID; 
       newPoav.Value = poav.Value; 
       newPoavs.Add(newPoav); 
      } 
      _db.CMSPageObjectAttributeValues.InsertAllOnSubmit(newPoavs); 
     } 

     _db.CMSPageObjects.InsertAllOnSubmit(newPageObjects); 
     _db.SubmitChanges(); 
    } 
+3

哪一行會引發錯誤? – Reniuz 2012-03-13 09:34:24

+0

我猜'newPoav.CMSPageObjectID = newPageObject.ID;'拋出錯誤。 – Martin 2012-03-13 09:37:57

+0

我已經更新了我的表格佈局的問題。 – Martin 2012-03-13 09:43:36

回答

3

它看起來像你試圖添加一個對象,而另一個具有相同的主鍵存在。主鍵是PageID還是CMSObjectID?或CMSAttributeID

您可能還想共享更多關於數據表的外觀。

更新:您添加的數據庫結構後,我想看看這條線接近:

newPoav.CMSPageObjectID = newPageObject.ID; 

newPageObject.ID很可能不會在這個時候知道,因爲你沒有對象添加到數據庫,但(我懷疑ID是身份)。我想你可以使用:

newPoav.CMSPageObject = newPageObject 
+0

我已經更新了我的表格佈局的問題。 – Martin 2012-03-13 09:44:19

+0

謝謝。我已經更新了我的答案;) – Arek 2012-03-13 09:50:19

+0

謝謝!看起來它正在工作! – Martin 2012-03-13 10:09:49

2

似乎您缺少CMSPageObject表上的主鍵或唯一鍵。請嘗試驗證數據庫中的密鑰。自從我錯過桌上的PK,我有同樣的問題。

乾杯。

+0

我已經更新了我的表格佈局的問題。 – Martin 2012-03-13 09:43:43

4

我得到這個錯誤,那是因爲我忘了設置在數據庫中「標識規範」(自動遞增)主鍵字段。但是,這只是一個猜測

+0

我已經用我的表格佈局更新了這個問題。 – Martin 2012-03-13 09:44:04

0

你必須添加一些代碼只是爲了測試如果列表newPoavs有鑰匙在數據庫中已經存在

你可以添加此

 foreach (CMSPageObjectAttributeValue poav in originalPoavs) 
     { 
      CMSPageObjectAttributeValue newPoav = new CMSPageObjectAttributeValue(); 
      newPoav.CMSAttributeID = poav.CMSAttributeID; 
      newPoav.CMSPageObjectID = newPageObject.ID; 
      newPoav.LCID = poav.LCID; 
      newPoav.Value = poav.Value; 
      newPoavs.Add(newPoav); 
      if(_db.CMSPageObjectAttributeValues.Any(x=>x.LCID == newPoav.LCID & x.CMSAttributeID == newPoav.CMSAttributeID & x.CMSPageObjectID == newPoav.CMSPageObjectID)) 
      MessageBox.Show("Already exist"); 
     } 

只是爲了測試你的值

相關問題