C# 使用2个EntityKey时实体框架插入错误
下面是我得到的错误示例。代码名等已经更改,以使其更易于阅读,并已“简化”以仅显示我遇到问题的部分 表结构: 总结 我试图使用EntityFramework 3.5添加一个新的子项和一个地址,当我在这个过程中使用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,
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);