c# - 无法使用已使用的键(LINQ)添加实体

标签 c# 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<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();
    }

最佳答案

似乎您要添加一个对象,而存在另一个具有相同主键的对象。是PageID还是CMSObjectID主键?还是CMSAttributeID

您可能还希望共享有关数据表外观的更多数据。

更新:添加数据库结构后,我将更仔细地浏览以下行:

newPoav.CMSPageObjectID = newPageObject.ID;


newPageObject.ID可能目前未知,因为您尚未将对象添加到数据库中(我怀疑是身份)。我认为您可以使用:

newPoav.CMSPageObject = newPageObject

关于c# - 无法使用已使用的键(LINQ)添加实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9681381/

相关文章:

c# - 为什么在 C# 中使用 Main() 而不是 main()?

C# - 你能用字符串的内容命名一个矩阵吗

c# - LINQ 组一种类型的项目

c# - Linq 列表列表到单个列表

c# - 如何使用将验证考虑在内的构建器自动创建测试数据

c# - 捕捉 System.Exception 总是不好的做法吗?

c# - 使变量在 C# 中的 if block 之外持续存在

c# - 添加后 FirstOrDefault 似乎没有调用数据库

c# - LINQ 交叉连接错误

c# - LINQ 获取所有继承人的 child