2011-08-10 25 views
2

レッツにおける企業の状態の変更、我々はOrderオブジェクトを持つCustomerオブジェクトを持っていると言います。 OrderオブジェクトにはOrderDetailオブジェクトがあります。は、Entity Frameworkの4.1

Customer oCustomer 
using(var context = new MyContext) 
{ 
oCustomer = context.Include("Order.OrderDetail").Find(1); 
} 
oCustomer.Name ="blah blah"; 
oCustomer.Order.Description = "blah blah"; 
oCustomer.Order.OrderDetail.Quantity = 10; 

は今、私は次のようにお客様の状態を変更する場合:

using(var context = new MyContext) 
{ 
    context.Entry(oCustomer).State = EntityState.Modified. 
    context.SaveChanges(); 
} 

これだけoCustomerオブジェクトではなくoCustomerにされている順序とOrderDetailが保存されます。 context.Entry(oCustomer).State = EntityState.Modifiedは、OrderおよびOrde​​rDetailではなくoCustomerの状態のみを変更します。現在、ObjectGraphの各エンティティの状態を手動で変更して、変更を保存する必要があります。親エンティティの代わりにObjectGraph全体の状態を変更する方法はありますか?拡張メソッドやその他の方法がありますか?

答えて

4

あなたはコンテキストとエンティティ間のリンクを切断しているので、ありません。すべてのエントリが変更された状態にあることを自動的に知ることはできません。

あなたはすべてのプロパティ上を歩くと、それらが構成でそうであればマップされているかどうかを確認、修正にそれらを設定するために、独自の拡張メソッドを作成します(または、あなたの派生オブジェクトのコンテキストクラスに追加する)ことができます。

は、私が最も簡単な方法は、あなたが他のプロセスでドンをしたすべての変更をやり直すことで、切断された環境で作業していると仮定します。 dbからエンティティを再度ロードし、プロパティを設定して変更を保存します。

+0

ありがとうございました。できます!!しかし、それはエレガントなソリューションですか?エンティティを保存する必要があるたびに、エンティティをリロードしています。 – Baig

+0

エンティティのすべての情報を持っている場合は、エンティティを新規作成することができます。すべてのエンティティをコンテキストに添付し、すべてを変更するように設定してからsavechangesを呼び出します。 http://stackoverflow.com/questions/7001602/asp-net-mvc-with-ef-4-1-navigation-properties/7008849#7008849は単純なシナリオでしか機能しません。 – BennyM

関連する問題