マスターディテール/マルチテーブル挿入のベストプラクティス/方法Entity Frameworkへの挿入

.net entity-framework linq linq-to-entities

質問

私のテーブル構成はこちら

Orders
------ 
Id int identity
OrderDate smalldatetime
OrderStatusid tinyint

Products
--------
Id int identity
Name varchar(50)

OrderDetails
------------
Id int identity
OrderId int (fkey)
ProductId int (fkey)
Amount decimal
Rate decimal

以下のコードを使用してEntity Frameworkを使用して挿入操作を試みます。
これは挿入を実行するための最良の方法ですか?
単純なproductId値を割り当てることができるのではなく、コンテキストオブジェクトから完全な商品アイテムを取得する方法に満足していません。

using (MyContextEntities ctx = new MyContextEntities())
{
    Orders newOrder = new Orders()
    {
    Name = "Gayle Wynand",
    OrderDate = DateTime.Now,
    IsComplete = true,
    Comments = "test",
    OrderStatusId = 2,
    IsActive = true
    };
    OrderDetails ode = new OrderDetails();
    ode.Products = ctx.Products.First(p => p.Id == 2); // any other way?
    ode.Quantity = 2;
    ode.Rate = 5.2;
    newOrder.OrderDetails.Add(ode);

    OrderDetails ode2 = new OrderDetails();
    ode2.Products = ctx.Products.First(p => p.Id == 3); // any other way?
    ode2.Quantity = 3;
    ode2.Rate =6.5;
    newOrder.OrderDetails.Add(ode2);


    ctx.AddToOrders(newOrder);
    ctx.SaveChanges();
}

これはマスターディテールを挿入する正しい方法ですか、それとももっと良い/他の方法がありますか。

受け入れられた回答

あなたが今していることはうまくいくでしょう。

ode.Productsを割り当てるときにデータベースクエリを実行したくない場合は、次の方法を使用できます。

// substitute your actual qualified entity set name
ode.ProductsReference.EntityKey = 
    new EntityKey("MyEntities.ProductsEntitySetName", "Id", 2);

これは速くなりますが、読みにくくなります。また、Productsプロパティは、ロードするまでnullになります。しかし、挿入物のために、これはしばしば大丈夫です。


人気のある回答

もう1つの方法は、EntityKeysではなくStubオブジェクトを使用することです。

var product = new Product {ID = 2};
ctx.AttachTo("Products", product);
ode.Product = product;

その他追加のボーナスとして、このコードは将来的にもPOCOオブジェクトで動作します。

このテクニックの詳細についてはこのブログ記事を参照してください。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ