2016-10-24 64 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

相关问题