2016-10-24 121 views
0

我在我的數據庫中有兩個表,我通過Web API填充:插入數據到多個表中使用實體框架

Orders 
________ 
OrderID 
OrderDate 
OrderStatusID 

OrderItems 
___________ 
OrderID 
ItemID 
ItemVersionID 
ItemNote 
ItemSortOrder 

我需要插入Order和所有項目在兩張桌子的訂單。 OrderID是數據庫生成的標識字段,我需要將數據插入到OrderItems表中。

OrderItems表的主鍵是一個組合鍵,因爲相同的順序可以包含具有相同ID但具有不同版本ID的多個項目,這一點很重要。

我想知道是否需要單獨添加OrderOrderItems數據,或者可以在單個控制器功能中添加數據。

下面是我的模型類:

[Table("SN_Orders")] 
    public class Order 
    { 
     [Key] 
     public int OrderID { get; set; } 
     public DateTime OrderDate { get; set; } 
     public int OrderStatusID { get; set; } 
     public List<OrderItem> Details { get; set; } 
    } 

    [Table("SN_OrderItems")] 
    public class OrderItem 
    { 
     [Column(Order = 0), Key] 
     public int ItemID { get; set; } 
     [Column(Order = 1), Key] 
     public int ItemVersionID { get; set; } 
     [Column(Order = 2), Key] 
     public int OrderID { get; set; } 
     public string ItemNote { get; set; } 
     public int ItemSortOrder { get; set; } 
    } 

而下面是我嘗試在OrderItems名單通過與Order沒有工作了:

[HttpPost] 
public IHttpActionResult PostItemToOrder(myClass.Order ord1, List<myClass.OrderItem> itemList) 
{ 
    if (!ModelState.IsValid) 
    { 
     return BadRequest(ModelState); 
    } 
    using (MyContext ctx = new MyContext()) 
    { 
     ctx.Orders.Add(ord1); 
     ctx.SaveChanges(); 

     foreach (var item in itemList) 
     { 
      item.OrderID=ord1.OrderId; 
      ctx.OrderItems.Add(item); 
      ctx.SaveChanges(); 
     } 
    } 
} 

是,東西是可能的立即完成?或者我必須先插入訂單,將OrderID返回給調用程序,然後插入項目?

回答

0

把它像這樣:

Order類應該有:

public class Order 
{ 
    public int Id { get; set; } 
    // all rest 

    public virtual ICollection<OrderItem> Items { get; set; } // here is the trick 
} 

[HttpPost] 
public IHttpActionResult PostItemToOrder(myClass.Order ord1, List<myClass.OrderItem> itemList) 
{ 
    if (!ModelState.IsValid) 
    { 
     return BadRequest(ModelState); 
    } 

    using (MyContext ctx = new MyContext()) 
    { 
     var order = ord1; 
     order.Items = itemList; 

     ctx.Orders.Add(order); 
     ctx.SaveChanges(); 
    } 
} 
+0

謝謝你的快速響應!我已更改'公開名單詳細信息{get;組; } to'public ICollection Details {get;組; }'並根據您的建議修改了控制器代碼,但它仍然無效。可以使用'virtual'關鍵字在Order模型聲明中有所作爲? – ElenaDBA

+0

在你的'OrderItem'類中你有'public virtual order {get;組; }'?上面的代碼應該沒有問題。 List itemList'列表中有什麼? –

+0

不,我沒有'公共虛擬Order Order {get;組; }'設置 – ElenaDBA

相關問題