2

以下是我遇到的错误示例。代码名称等已更改以使其更具可读性,并且已“简化”以仅显示我遇到问题的部分。

表结构: 我正在使用的基本表格布局

概括

我正在尝试使用 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

我仍然不希望使用它,因为它迫使您必须检查上下文中已有的信息,然后它会创建“假”记录以通过它作为解决方法。如果有人有更多信息,我很想听听!

4

0 回答 0