2016-06-14 49 views
2

うまくいきますように。予期しない行数(0)、ストア更新、挿入、または削除文が影響を受けました。

この問題を解決するために親切に助けてください。以下のコードをASP.NET mvc webアプリケーションで使用しています。

[HttpPost] 
     public ActionResult ProductAddonsAdd(int? id, tblproductattributemapper model, string AllStorechk, int? ddlProduct, int? ddlCompany, string hdCompanyProductID) 
     { 

      DbTransaction dbTran = null; 
      try 
      { 
       tblproductattributemapper tblattributValMapper = new tblproductattributemapper(); 
       db.Connection.Open(); 
       dbTran = db.Connection.BeginTransaction(); 
       int CompanyProductID = 0; 
       if(!string.IsNullOrEmpty(hdCompanyProductID)) 
       { 
        CompanyProductID=Convert.ToInt32(hdCompanyProductID); 
       } 
       else 
       {CompanyProductID=db.tblcompanyproducts.Where(x => x.nProductID == ddlProduct && x.nCompanyID == ddlCompany).FirstOrDefault().nCompanyProductID;} 
       if (id == null) 
       { 
        if (db.tblproductattributemappers.Where(x => x.nCompanyProductID == CompanyProductID && x.nAttributeID == model.nAttributeID).Count() != 0) 
        { 
         TempData["Errmsg"] = "Addon value already exist with this product!"; 
         return RedirectToAction("ProductAddons"); 
        } 

        tblattributValMapper = new tblproductattributemapper(); 
        tblattributValMapper.nAttributeID = model.nAttributeID; 
        tblattributValMapper.nCompanyProductID = CompanyProductID; 
        db.AddTotblproductattributemappers(tblattributValMapper); 
       } 
       else 
       { 
        tblattributValMapper = db.tblproductattributemappers.Where(x => x.nMapperID == id).FirstOrDefault(); 
        tblattributValMapper.nAttributeID = model.nAttributeID; 
        tblattributValMapper.nCompanyProductID = CompanyProductID; 

       } 

       db.SaveChanges(); //// Error comes here when it goes into else part(update mode) then executed here 
       // deleting objects 
       var objmapperdetails = db.tblproductattributemapperdetails.Where(x => x.nMapperID == tblattributValMapper.nMapperID).ToList(); 
       if (objmapperdetails != null && objmapperdetails.Count() > 0) 
       { 
        foreach (var item in objmapperdetails) 
        { 
         db.tblproductattributemapperdetails.DeleteObject(item); 
        } 
       } 
       string[] arrAllStore = AllStorechk.Split(','); 
       tblproductattributemapperdetail detail; 
       foreach (var item in arrAllStore) 
       { 
        Int64 _id = Convert.ToInt64(item); 
        detail = new tblproductattributemapperdetail(); 
        detail.nMapperID = tblattributValMapper.nMapperID; 
        detail.nAttributeValueMasterID = _id; 
        detail.nPrice = db.tblattributevaluemasters.Where(x => x.nAttributeValueMasterID == _id).FirstOrDefault().nPrice; 
        db.AddTotblproductattributemapperdetails(detail); 
       } 

       db.SaveChanges(); 
       dbTran.Commit(); 
       TempData["Successmsg"] = "Saved successfully"; 
      } 
      catch (Exception ex) 
      { 
       dbTran.Rollback(); 
       TempData["Errmsg"] = "Failed to save "; 
       Common.TrapError(ex.StackTrace, "Attribute/ProductAddons"); 
      } 
      finally 
      { 
       db.Connection.Close(); 
      } 
      return RedirectToAction("ProductAddons"); 
     } 

編集モードでレコードを開き、何も変更せずに送信すると、その時点で他の部分に移動し、エンティティtblattributValMapperのプロパティnAttributeID & nCompanyProductIDをdb.SaveChanges();という古い値で更新します。エラー "Store update、insert、またはdeleteステートメントが予期しない行数(0)に影響を与えました。エンティティがロードされてからエンティティが変更または削除されている可能性があります。

私はGoogleでそれを確認し、db.Refresh(RefreshMode.ClientWins,tblattributValMapper );

のようないくつかの解決策を適用するが、それは私を助けていません。

私はこのプロジェクトに取り組んでいる単一の開発者であり、エンティティは他の場所から更新されていないため、プライマリキーの値もチェックしてモデルを通過しています。 誰かが私が間違っているところにアイデアを持ち込むことはできますか? 添付のスクリーンショットをご覧ください。

何か助力をいただければ幸いです。

答えて

0

以下のコードを使用して問題を解決しました。それは更新モードで私のために働く。

try 
    { db.SaveChanges(); } 
    catch (OptimisticConcurrencyException) 
    { 
    db.Refresh(RefreshMode.StoreWins, tblattributValMapper); 
    db.SaveChanges(); 
    } 

ありがとうございます。

関連する問題