以下是我遇到的错误示例。代码名称等已更改以使其更具可读性,并且已“简化”以仅显示我遇到问题的部分。
表结构:
概括
我正在尝试使用 Entity Framework 3.5 添加一个新的 CHILD 项目和一个 ADDRESS,当我在此过程中使用 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;
}
如果我尝试引用两个外键,这将不起作用;但是,如果我只是尝试引用其中一个,它就可以正常工作。第一个将始终有效。第二个将给出错误。它们的顺序无关紧要。如果我自己使用它们或像这样以其他方法使用它们,它们就可以正常工作。
我还尝试获取实际项目,而不仅仅是参考,例如:
PARENT o = e.PARENTs.First(x => x.ID.Equals(id));
PROVINCE p = e.PROVINCEs.First(x => x.ID.Equals(1));
a.PROVINCE = p;
c.ADDRESS = a
c.PARENT = o;
而且,在发现类似错误后,我尝试使用 .Attach() 方法:
e.Attach(p);
e.Attach(o);
当我以第一种方式(我的首选方式)执行此操作时,首先添加的任何项目都可以正常工作。当我尝试第二个时,出现错误(已添加具有相同密钥的项目)。如果我尝试通过提取实际记录而不是仅使用参考来做到这一点,我会直接从 SQL Server 2005 数据库中获得相同类型的错误。
在阅读了这一点之后,它与 Context 以及代码可能引用了父记录的 2 个不同版本的事实有关,这是有道理的;但是,我找不到解决它的好方法。
最后我要做的就是插入一个带有新地址的子记录。子记录必须引用父记录,地址记录必须引用省记录。最好,我想通过引用来减少 sql 事务。
谢谢!
编辑
试图创建我自己的 2 个单独的 entityKey 对象和 2 个单独的 EntityReference<> 对象,现在当我尝试使用第二个 EntityReference<> 对象分配关系/引用时出现以下错误:
无法初始化 EntityReference,因为实体引用所属对象的关系管理器已附加到 ObjectContext。
编辑
使用不需要来自 Alex 的回答中的任何关系/参考信息的解决方法:Entity Framework EntityKey / Foreign Key problem
我仍然不希望使用它,因为它迫使您必须检查上下文中已有的信息,然后它会创建“假”记录以通过它作为解决方法。如果有人有更多信息,我很想听听!