2

我对实体框架有疑问....我不太了解。

我正在处理一项看似简单的任务,即将现有联系人与我正在处理的系统中的新订单相关联。在与订单关联之前,联系人将始终存在。

简化的数据库表...

订单
OrderID
状态已
创建

联系人 联系人
ID
名字
姓氏

ContactToOrderMap
OrderID
ContactID

我已经在 DbContext 中链接了这两个表。

 modelBuilder.Entity<Order>()
                .HasMany<Contact>(a => a.Contacts)
                .WithMany()
                .Map(a =>
                    {
                        a.ToTable("ContactToOrderMap");
                        a.MapLeftKey("OrderID");
                        a.MapRightKey("ContactID");
                    });

我编写了一个单元测试,它简单地创建一个订单,一个联系人,将联系人添加到订单上的列表成员并尝试保存。

// setup 
var order = new Order() { // initialize required fields };

// add a contact that already exists in the database
var orderContact = new Contact() { ID = 2 }; 
order.Contacts.Add(orderContact);

// call
logic.Save(ref order);

最终,在执行了一些不相关的业务逻辑之后,这个订单被保存了......

// Add to collection
_db.Orders.Add(obj);
// Commit changes
_db.SaveChanges();

>> 在这里,我收到与联系人表上所需数据库字段相关的错误。 不是我要找的,因为我真的只想在 ContactToOrderMap 表中添加一个关联记录。

下一步,我尝试在保存订单之前从数据库中检索现有联系人。这段代码不是很干净,但它应该解释我正在尝试什么。

    if (currentOrder.Contacts != null)
    {
        var matchedContacts = new List<Contact>();

        foreach (var con in currentOrder.Contacts)
        {
            matchedContacts.Add(_contactLogic.Get(con.ID));
        }

        currentOrder.Contacts.Clear();
        foreach (var item in matchedContacts)
        {
            currentOrder.Contacts.Add(item);
        }
    }

这创建了关联,但也创建了一个新的联系人(新的唯一 ID)。

目标是仅创建关联和新订单,而不是创建新联系人。

有什么想法或指示可以让我朝着正确的方向前进吗?

如果需要其他信息,请告诉我。

编辑:固定代码 - 将 obj 重命名为 currentOrder。

4

1 回答 1

3

线后

var orderContact = new Contact() { ID = 2 };

_db.Contacts.Attach(orderContact);

现在联系人是一个Unchanged状态的上下文的一部分,并且

order.Contacts.Add(orderContact);

不会再改变它的状态Added

于 2013-02-19T20:49:04.343 回答