EF

2016-08-12 10 views
0

で同時に親オブジェクトとその子(親の外部キーを持つ)のリストを保存する以下のコードはSalesOrderテーブルにSales Ordersを、SalesOrderDetailテーブルにSales Order Detailsを自動的に保存しますか?EF

私の目標は、自分のプライマリエンティティのリストを作成し、そのナビゲーションプロパティを使用して別のリストを作成し、すべてをワンショットで保存できるようにすることです。

以下を参照してください:

List<SalesOrder> salesOrders = new List<SalesOrder>() 
{ 
    new SalesOrder() 
    { 
     OrderDate = DateTime.Now, 
     OrderDetails = new List<SalesOrderDetail>() 
     { 
      new SalesOrderDetail() { ItemId = 1 }, 
      new SalesOrderDetail() { ItemId = 2 }, 
      new SalesOrderDetail() { ItemId = 3 } 
     } 
    }, 
    new SalesOrder() 
    { 
     OrderDate = DateTime.Now, 
     OrderDetails = new List<SalesOrderDetail>() 
     { 
      new SalesOrderDetail() { ItemId = 1 }, 
      new SalesOrderDetail() { ItemId = 2 } 
     } 
    } 
}; 

_context.SalesOrders.AddRange(salesOrders); 
_context.SaveChanges(); 

や私のような何かをする必要がありますするつもりです:

_context.SalesOrders.AddRange(salesOrders); 
_context.SalesOrderDetails.AddRange(salesOrders[0].OrderDetails); 
_context.SalesOrderDetails.AddRange(salesOrders[1].OrderDetails); 
_context.SaveChanges(); 
+3

コードを実行して動作するかどうかを確認します。 –

+0

@ ZivWeissmanのアドバイスが最適です。実験!しかし、肘掛け椅子(実験的なものではないと考える)の観点から。なぜこれが機能するのかわかりません。 EFは、エンティティをリンクするためにプロパティを使用します。これは、SQL結合条件のEFに相当します。 SalesOrdersとSalesOrderDetailsのどちらにも、関連エンティティへのリンクが必要な情報はありません。私は、EFが実際に2つのエンティティをどのようにリンクするかを示す答えを示す例を投稿します。 – DWright

答えて

1

私はEntity Frameworkのコア1.0(EF7)を使用していて、次は完全に働いたし。私のモデルが設定されているどのように注意してください:

public class SalesOrder 
    { 
     public int Id {get; set;} 
     public DateTime OrderDate {get; set;} 
     // Nav property 
     public ICollection<SalesOrderDetail> OrderDetails { get; set; } 
    } 

    public class SalesOrderDetail 
    { 
     public int Id {get; set;} 
     // Foreign key property 
     public int SalesOrderId {get; set;} 
     // Nav property 
     public SalesOrder SalesOrder {get; set;} 
    } 

は、単に以下の作業を行うと、自動的に私はそれらを指定しなくても、正しい外部キー値を保存します。

List<SalesOrder> salesOrders = new List<SalesOrder>() 
{ 
    new SalesOrder() 
    { 
     OrderDate = DateTime.Now, 
     OrderDetails = new List<SalesOrderDetail>() 
     { 
      new SalesOrderDetail() { ItemId = 1 }, 
      new SalesOrderDetail() { ItemId = 2 }, 
      new SalesOrderDetail() { ItemId = 3 } 
     } 
    }, 
    new SalesOrder() 
    { 
     OrderDate = DateTime.Now, 
     OrderDetails = new List<SalesOrderDetail>() 
     { 
      new SalesOrderDetail() { ItemId = 1 }, 
      new SalesOrderDetail() { ItemId = 2 } 
     } 
    } 
}; 

_context.SalesOrders.AddRange(salesOrders); 
_context.SaveChanges(); 

はい、ナビゲーションプロパティはありませんデータを取得するときにインクルードを使用するときにのみ役立ちますが、保存をもっと簡単にします。

+0

ニース!私はそれを自分で試してみるつもりでしたが、まずデータベースを作成しなければなりませんでした。これは知っていることは素晴らしいことです。 – DWright