Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用2个EntityKey时实体框架插入错误_C#_Sql Server_Entity Framework_Entitykey - Fatal编程技术网

C# 使用2个EntityKey时实体框架插入错误

C# 使用2个EntityKey时实体框架插入错误,c#,sql-server,entity-framework,entitykey,C#,Sql Server,Entity Framework,Entitykey,下面是我得到的错误示例。代码名等已经更改,以使其更易于阅读,并已“简化”以仅显示我遇到问题的部分 表结构: 总结 我试图使用EntityFramework 3.5添加一个新的子项和一个地址,当我在这个过程中使用2个entitykey引用时,会出现重复的条目错误 代码工作 首先,我尝试在创建实体时使用父引用: public bool AddChild(Guid parentId, string firstName, string lastName, string address,

下面是我得到的错误示例。代码名等已经更改,以使其更易于阅读,并已“简化”以仅显示我遇到问题的部分

表结构:

总结

我试图使用EntityFramework 3.5添加一个新的子项和一个地址,当我在这个过程中使用2个entitykey引用时,会出现重复的条目错误

代码工作

首先,我尝试在创建实体时使用父引用:

        public bool AddChild(Guid parentId, string firstName, string lastName, string address, string city, int provinceCode)
    {
        bool success = false;

        using (Entities e = new Entities("connection string")
        {
            // prep address record
            ADDRESS a = new ADDRESS
            {
                City = city,
                Address = address,
                PROVINCEReference = new System.Data.Objects.DataClasses.EntityReference<PROVINCE> { EntityKey = new System.Data.EntityKey("Entities.PROVINCEs", "ID", provinceCode) },
            };

            // prep owner record
            CHILD c = new CHILD
            {
                PARENTReference = new System.Data.Objects.DataClasses.EntityReference<PARENT> { EntityKey = new EntityKey("Entities.PARENTs", "ID", new Guid(parentId)) },
                ADDRESS = a,
                FirstName = firstName,
                LastName = lastName,
            };

            using (System.Transactions.TransactionScope transaction = new System.Transactions.TransactionScope())
            {
                try
                {
                    e.AddToCHILDs(c);
                    e.AddToADDRESSes(a);

                    // Save changes pessimistically. This means that changes must be accepted manually once the transaction succeeds.
                    e.SaveChanges(false);
                }
                catch { }
            }
        }
    return success;
}
在发现类似错误后,我尝试使用.Attach方法:

e.Attach(p);
e.Attach(o);
当我以我喜欢的方式第一次做的时候,无论先添加哪个项目,都不会有任何问题。当我尝试第二个时,我得到一个错误,已经添加了一个具有相同密钥的项。如果我试图通过提取实际记录而不是仅仅使用引用来实现这一点,那么直接从SQLServer2005数据库中就会得到相同类型的错误

在阅读了这篇文章之后,它与上下文以及代码可能引用父记录的两个不同版本有关,这是有道理的;然而,我找不到一个好办法

最后,我只想插入一个带有新地址的子记录。子记录必须引用父记录,地址记录必须引用省记录。我更愿意通过引用来减少sql事务

谢谢

编辑

尝试创建我自己的两个单独的entityKey对象和两个单独的EntityReference对象,现在我在尝试使用第二个EntityReference对象分配关系/引用时遇到以下错误:

无法初始化EntityReference,因为关系 实体引用所属对象的管理器已存在 附加到ObjectContext

编辑

使用不需要Alex回答中的任何关系/参考信息的变通方法:

我还是不想使用它,因为它迫使您必须进行检查,以查看上下文中已经存在哪些信息,然后它会创建虚假记录,作为一种解决方法。如果有人有任何更多的信息,我很想听到

e.Attach(p);
e.Attach(o);