2017-02-12 10 views
1

以下は、オーダーアイテムとオーダーアイテムを一度に挿入するために以下の方法を使用するネットコードです。orderIDを取得し、それを使用してオーダーアイテムに挿入する(オーダー作成機能)

Models.ShopDBEntities db = new ShopDBEntities(); 

    public IEnumerable<Basket> GetList() 
    { 
     return db.Baskets.Where(x => x.UserName == UserName); 
    } 

    public void CreateOrder(Models.Order order) 
    { 
     foreach (var b in GetList()) 
     { 
      OrderItem oi = new OrderItem() 
      { 
       Price = b.Product.Price, 
       ProductID = b.ProductID 
      }; 
      order.OrderItems.Add(oi); 
     } 
     db.Orders.Add(order); 
     db.SaveChanges(); 

     ClearBasket(); 
    } 

これは私にとっては理解が少し難しいです。私はorderIDが必要になる前に、注文アイテムにレコードを挿入することを理解しています。今私は理解しやすく、段階的なCreateOrder関数を示す別の方法を探しています。

1-最初にordersテーブルにレコードを挿入して保存します。

2-次に、挿入された注文の注文IDを取得し、注文アイテムに挿入して保存するために使用します。私は、注文品目にレコードを挿入するための理解

答えて

1

は、[最初]我々は、データベースがないのorderID

号を持っている必要がありますが、Entity Frameworkのは、そのあなたのために透過的に処理します。

表示されているコードは、注文明細行を注文に追加してから、注文明細行を1つのトランザクションに挿入します。

最初に注文を挿入し、自動生成された主キーを取得し、それを使用して注文明細行を挿入します。

これは、コンテキストに追加されたOrderItemが、オブジェクト参照によって追加されたOrderと同じOrderItemであることをEntity Frameworkが認識するためです。

実際、Entity Frameworkはデータベーススキーマの複雑さを隠すはずのORMであるため、OrderIdプロパティを公開する必要はありません。Entity Frameworkには、と連携。

あなたはは、別々のステップで何が起こるか見てみたいん場合、それは順序を保存するには、このようになります。

var order = new Order 
{ 
    Description = "Example order" 
}; 

db.Orders.Add(order); 
db.SaveChanges(); 

order.Idプロパティは、あなたの主キー、が割り当てられているSaveChanges()後オーダーアイテム行を追加することができます:

var orderItem1 = new OrderItem 
{ 
    OrderId = order.Id, 
    Description = "Order 1 Item 1" 
}; 
var orderItem2 = new OrderItem 
{ 
    OrderId = order.Id, 
    Description = "Order 1 Item 2" 
}; 
var orderItem3 = new OrderItem 
{ 
    OrderId = order.Id, 
    Description = "Order 1 Item 3" 
}; 

db.OrderItems.Add(orderItem1); 
db.OrderItems.Add(orderItem2); 
db.OrderItems.Add(orderItem3); 
db.SaveChanges(); 
関連する問題