繁体   English   中英

在实体框架中添加具有引用类型的新行

[英]Adding new row with referenced types in 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);

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

非常感谢。

似乎您的对象上下文处理有问题。 该错误表明您尝试添加实体时该实体已经与对象上下文相关联。 我假设您在执行多个Web请求时保持活动状态,但是为每个Web请求创建一个新的对象上下文。 您必须将实体与旧的上下文分离,并将它们附加到新的实体上,以使此工作正常。

有关类似问题,请参见MSDN

谢谢danbruc,

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

这有效:

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;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM