1

私はEF5、POCOデータベースファーストアプローチを使用しています。新しい顧客と新しい注文を作成する必要があるとしましょう:-

var customer = new Customer();
var order = new Order();

order.Customer = customer;
order.CustomerId = customer.Id;

customer.Orders.Add(order);

関係を設定するために、これらの最後の3行を本当に含める必要がありますか?ここで指摘するのは、メモリ内にエンティティ階層を作成し、ユーザーが[保存]をクリックするまで、潜在的に長い時間それを操作しているということです。

私を混乱させているのは、いくつかの新しいCustomerオブジェクトを作成するというアイデアです。それぞれが0のIDで終了します(永続化される前)。私のコードには、OrderのCustomerIdプロパティを使用して何かを行うさまざまな場所があります。複数の新規顧客(ID 0)がある場合、適切な顧客を取得するにはどうすればよいですか?または、常に使用する必要がOrder.Customerあり、決して使用しないでくださいOrder.CustomerId(この場合、上記のコードのID割り当てを削除しても安全ですか)。

4

1 に答える 1

1

新規顧客を追加する場合、グラフ全体が挿入され、関係が適切に設定されます。リレーションを手動で設定する必要はありません(1対多のエンティティの追加を参照)。

var customer = new Customer();
customer.Orders.Add(new Order());
context.Customers.Add(customer);
context.SaveChanges();

顧客に電話をかけるとCustomers.Add、エンティティがコンテキストに追加され、Added状態になります。関連するすべてのエンティティ(注文)でも同じことが起こります-それらにはAdded状態があります。すべてのグラフは、SaveChanges呼び出し時にデータベースに挿入されます。

このトリックはグラフの更新には機能しないことに注意してください。

ところで:読む価値のある関係の定義と管理に関するMSDNの素晴らしい記事があります。


更新:EFを使用しているときに何が起こるかを次に示します。

var customer = new Customer();
var order = new Order();
customer.Orders.Add(order); // order.Customer is null

この時点で、EFは完全には関与していません。注文オブジェクトの顧客を手動で設定できます。Add通常、私はまたはRemoveメソッドで双方向の関連付けを管理します。つまり、注文コレクションに注文を追加し、所有者をに設定しthisます。この時点でそれはあなた次第です。デフォルトでは、注文の所有者はになりますnull。次:

context.Customers.Add(customer); // order.Customer is customer, but no ids

これがEFです。データベースには何も保持されません。しかし、EFは、注文が顧客に関連していることを知るのに十分賢く、顧客(所有者)の参照をこの特定の顧客に設定します。もうありませnullん。ただし、このように何も永続化されず、オブジェクトにはまだIDがありません。

context.SaveChanges(); // ids updated

出来上がり。これで、EFはオブジェクトをデータベースに挿入しました。IDを受け取り、正しいIDでオブジェクトを更新しました。

于 2013-03-05T10:12:41.313 に答える