在Entity Framework中添加带引用类型的新行

时间:2009-04-12 19:23:28

标签: c# asp.net entity-framework

我正在使用Entity Framework几周。这很好,但是如何正确添加引用子项(表)的新行?

我尝试了这个程序

CMS.ShopOrder order = new CMS.ShopOrder();

    order.CreatedOn = DateTime.Now;

    foreach (var item in CMS.CurrentSession.Cart.Items)
    {           
        order.ShopOrderItems.Add(item);
    }

    db.AddToShopOrder(order);       

    int selT = FormatHelper.GetInt32(ddTransport.SelectedValue);
    int selP = FormatHelper.GetInt32(ddTransport.SelectedValue);    

    order.Transportation = db.Transportation.Where(t => t.Id == selT).FirstOrDefault();
    order.Payment = db.Payment.Where(p => p.Id == selP).FirstOrDefault();
    order.Customer = db.Customer.Where(c=>c.Id == CMS.CurrentSession.Customer.Id).FirstOrDefault();

    db.SaveChanges();

但我收到了错误:

  

IEntityChangeTracker的多个实例无法引用实体对象。   第492行:base.AddObject(“ShopOrder”,shopOrder);

我可以一次添加所有这些记录吗?

非常感谢。

2 个答案:

答案 0 :(得分:2)

您的对象上下文处理似乎有问题。该错误表示当您尝试添加实体时,该实体已与对象上下文关联。我假设您在执行多个Web请求时保留了一些活动但您为每个Web请求创建了一个新的对象上下文。您必须从旧上下文中分离实体并将它们附加到新上下文中才能使其正常工作。

有关类似问题,请参阅MSDN

答案 1 :(得分:0)

谢谢danbruc,

问题是,当我将对象添加到会话时,我没有从entityContext中分离对象。

这有效:

public CMS.ProductVariant GetProductVariantById(int id)
    {
        ProductVariant pv = null;
        if (id > 0)
        {
            using (db = new CmsEntity())
            {
                pv = db.ProductVariant.Where(v => v.Id == id).FirstOrDefault();
                db.Detach(pv); 
            }
        }
        return pv;
    }