无法添加具有已在使用的密钥的实体(LINQ)

我收到此错误Cannot add an entity with a key that is already in use. 当我运行下面的代码时。

表: 在此处输入图像描述

我错过了什么?

  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 newPageObjects = new List(); 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 newPoavs = new List(); 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(); } 

看起来您正在尝试添加对象,而另一个具有相同的主键存在。 是PageID还是CMSObjectID主键? 还是CMSAttributeID

您可能还想分享有关数据表格外观的更多数据。

更新:添加数据库结构后,我会仔细看看这一行:

 newPoav.CMSPageObjectID = newPageObject.ID; 

目前可能不知道newPageObject.ID ,因为你还没有将对象添加到DB(我怀疑ID是标识)。 我想你可以用:

 newPoav.CMSPageObject = newPageObject 

我收到此错误是因为我忘记将数据库中的主键字段设置为“标识规范”(自动增量)。 但这只是猜测

似乎您缺少CMSPageObject表上的主键或唯一键。 请尝试validation数据库中的密钥。 我有同样的问题,因为我错过了桌上的PK。

干杯。

如果列表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"); } 

只是为了测试你的价值观