2009-04-12 9 views
0

私は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(); 

この手順を試してみましたが、私はエラーを得た:

An entity object cannot be referenced by multiple instances of IEntityChangeTracker. Line 492: base.AddObject("ShopOrder", shopOrder);

私は一度にすべてのこれらのレコードを追加することはできますか?

ありがとうございます。

答えて

2

あなたのオブジェクトコンテキスト処理に問題があるようです。このエラーは、エンティティがオブジェクトコンテキストを追加しようとしたときに、すでに関連付けられていることを示します。私はあなたが複数のWeb要求を実行している間いくつかのentiteを生かしていると仮定しますが、すべてのWeb要求に対して新しいオブジェクトコンテキストを作成します。この作業を行うには、古いコンテキストからエンティティを切り離して、新しいコンテキストにエンティティを添付する必要があります。

同様の問題については、MSDNを参照してください。

0

おかげでdanbruc、

問題は、私がセッションに追加されたとき、私はエンティティ・コンテキストからオブジェクトをデタッチしていないということでした。

これは動作します:

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; 
    } 
関連する問題