2012-03-13 40 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"); 
     } 

只是为了测试你的值

相关问题