2011-01-02 7 views
2

私はこのスキーマを持っている:方法:関連するエンティティを挿入しないでください。

http://img602.imageshack.us/img602/6978/schemac.png

私は、データベースにのOrderItemsで注文を挿入したいので、私はこの方法を書いた:

public void SaveOrder(Order order) 
    { 
     using (var repository = new StoreEntities()) 
     { 
      // Add order. 
      repository.Orders.AddObject(order); 

      // Add order items. 
      foreach (OrderItem orderItem in order.OrderItems) 
      { 
       repository.OrderItems.AddObject(orderItem); 
      } 

      repository.SaveChanges(); 
     } 
    } 

すべてが新しいことを除いて、うまく挿入されています商品のレコードも挿入されています、これは私が望むものではありません。

私が望むのは、OrderグラフとそのOrderItemsを挿入することです。どのように達成することができますか?

本当にありがとうございます、ありがとうございます。

+0

一時的な製品への参照を使用してOrderItemを永続させている場合、製品を永続させない*とはどういう意味でしょうか? Product Referenceとしてnullを持つOrderItemsになります。 – Rytmis

+0

私はすでに製品のデータベースを持っているので、OrderItem.Productは既に永続化されている製品のナビゲーションプロパティです。 – niaher

+0

ああ、あなたのProductItemsが非一時的な*製品に添付されていて、あなたはまだデータベースに新しい製品を入れていると言っていますか? – Rytmis

答えて

3

オーダーでAddObjectを呼び出すと、オブジェクトグラフのすべてのアイテムが挿入済みとしてマークされます。

public void SaveOrder(Order order)  
{   
    using (var repository = new StoreEntities())   
    {    
    // Add order - calling add object marks Order and all entities in its 
    // object graph as Added - they will be inserted to database    
    repository.Orders.AddObject(order);    

    // You don't need to add order items because they should be added together 
    // with order 

    // But you don't want to insert Products again, do you? 
    // So you have to say that Products are not Added but Unchanged    
    foreach (var orderItem in order.OrderItems)    
    {     
     // Not sure how to do it with your repository but with ObjectContext 
     // you can do 
     // context.ObjectStateManager.ChangeObjectState(orderItem.Product, 
     // EntityState.Unchanged); 
    }  
    } 
} 
+0

優秀! ChangeObjectState(orderItem.Product、System.Data.EntityState.Unchanged)は魅力的に機能しました。ありがとうございました。フォローアップの質問には、依存関係のすべての行を切り取る方法があります。たとえば、私のケースでは、OrderItem.ProductとOrderItem.Product.DescriptionのChangeObjectStateをEntityState.Unchangedに持っていなければなりませんでしたが、StopUpdatePropagation( "OrderItem"、 "Product")のようなものを1回の呼び出しで指定する方法がありますオブジェクト全体のコンテキストについては? – niaher

+1

いいえこのような方法はありません。分離されたオブジェクトグラフで作業する場合、オブジェクト全体のグラフがObjectContextに追加され、エンティティの状態を手動で処理する必要があります。 –

+0

ちょうど私が知る必要があったもの。ありがとうございました。 – niaher

1

私はEFエクスペリエンスが実質的にゼロですが、製品が新しいコンテキストに保存されている可能性があります。これを追加した場合は助けになりますか?

repository.Attach(orderItem.Product); 

AddObjectコールの直前ですか?

関連する問題