2017-01-09 3 views
0

データベース内の2つのテーブルに、前のページのパラメータとしてリストを取り込む関数で書き込もうとしています。エントリが生成されると、列はIDENTITY主キーであるため、purchase_order_noを取得するためにdbを呼び出します。ASP.NET MVC OptimisticConcurrencyException

モデル:

[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; } 

order_detail

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; } 

デシベルに私の新しい '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.purchase_order.Add'を' db.Entry(po).State = EntityState.Added; 'に置き換えてみてください。 –

答えて

1

私はこの問題は、あなたのモデルクラスであると思います。 purchase_orderには、なぜ多くの列に[Key]というフラグが設定されていますか? purchase_order_noはID列として宣言されているため、それ自体で主キーにする必要があります。あなたの設定が意味をなさないため、EFが起動時に不平を言っていない理由は分かりません。

他のすべての列の[Key]属性を削除しても問題ありません。一意性を確保する必要がある場合は、他の列に一意の索引を作成できます。

+0

モデルはVS2015で作成されました。これらのモデルを既存のデータベースに基づいて作成したのは、「コードファースト」という選択肢でした。 – TaylorM