2017-01-09 129 views
0

我正试图写入我的数据库中的两个表中的一个函数,该函数使用列表作为上一页中的参数。我调用db来检索purchase_order_no,因为该列是在条目上生成的IDENTITY主键。ASP.NET MVC OptimisticConcurrencyException

型号:

PURCHASE_ORDER

[Key] 
    [Column(Order = 0)] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int client_no { get; set; } 

    [Key] 
    [Column(Order = 1)] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int purchase_order_no { get; set; } 

    [StringLength(60)] 
    public string name { get; set; } 

    [Key] 
    [Column(Order = 2)] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int order_group_no { get; set; } 

    [StringLength(24)] 
    public string purchase_order_reference { get; set; } 

    [Key] 
    [Column(Order = 3)] 
    public DateTime order_timestamp { get; set; } 

order_detail

[Key] 
    [Column(Order = 0)] 
    public long order_detail_no { get; set; } 

    [Key] 
    [Column(Order = 1)] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int purchase_order_no { get; set; } 

    [Key] 
    [Column(Order = 2)] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int inventory_no { get; set; } 

    [Key] 
    [Column(Order = 3)] 
    public decimal quantity { get; set; } 

    public int? vendor_no { get; set; } 

试图插入我的新PURCHASE_ORDER'模型到数据库时,我收到此错误:

存储更新,插入或删除语句影响了意外数量的行(0)。自实体加载后,实体可能已被修改或删除。有关理解和处理乐观并发异常的信息,请参阅http://go.microsoft.com/fwlink/?LinkId=472540

[HttpPost] 
    public ActionResult orderForm (List<int> quantity, List<string> itemName, List<int> inventory_no, List<int> client_no, List<int> vendorCode, int orderGroupNo) 
    { 
     using (var db = new db_model()) 
     { 
      var ctx = ((IObjectContextAdapter)db).ObjectContext; 
      purchaseOrderVM poVM = new purchaseOrderVM(); 
      List<order_detail> tempList = new List<order_detail>(); 
      purchase_order po = new purchase_order(); 
      po.client_no = client_no[0]; 
      var purchaseOrder = db.purchase_order.Where(x => x.client_no == po.client_no).Max(x => x.purchase_order_no); 
      po.order_group_no = orderGroupNo; 
      po.order_timestamp = DateTime.Now; 
      db.purchase_order.Add(po); 
      try 
      { 
       db.SaveChanges(); <!-- This is where I get the error --> 
      } 
      catch (OptimisticConcurrencyException e) 
      { 
       ctx.Refresh(RefreshMode.ClientWins, db.purchase_order); 
       throw e; 

      } 
      for (int i = 0; i < itemName.Count(); i++) 
      { 
       order_detail od = new order_detail(); 
       od.purchase_order_no = db.purchase_order.Where(x => x.client_no == po.client_no).Max(x => x.purchase_order_no); 
       od.inventory_no = inventory_no[i]; 
       od.quantity = quantity[i]; 
       od.vendor_no = vendorCode[i]; 
       db.order_detail.Add(od); 
       try 
        { 
         db.SaveChanges(); 
        } 
       catch (OptimisticConcurrencyException e) 
        { 
         ctx.Refresh(RefreshMode.ClientWins, db.order_detail); 
         throw e; 
        } 
       tempList.Add(od); 
      } 
      poVM.purchase_order = po; 
      poVM.orderList = tempList; 
      return View(poVM); 

     } 
    } 
+0

您是添加实体还是更新现有实体? –

+0

添加实体。 – TaylorM

+0

你可以尝试用'db.Entry(po).State = EntityState.Added;'来替换'db.purchase_order.Add'吗? –

回答

1

我认为这个问题是在你的模型类。在purchase_order中,为什么有这么多列标记为[Key]?由于purchase_order_no被声明为标识列,因此它应该是主键。我甚至不知道为什么EF在启动时不会抱怨,因为您的配置没有意义。

删除所有其他列上的[Key]属性,它应该可以工作。如果您需要确保唯一性,则可以在其他列上创建唯一索引。

+0

这些模型是在VS2015中创建的我相信这是“代码优先”的选项,可以生成这些模型,因为它们基于现有的数据库。 – TaylorM