1

関数では、関連する値のリストを渡し、それらをループしてデータベースに変更を保存します。2 人以上の人が同じページを使用して異なるエンティティを更新するまで、すべて正常に機能します。その後、変更が最近行われたデータのみが保存されます。

   public bool UpdatePermanentDifferenceBL(List<PermanentDifferenceProperties>                                permDiffDetails)
   {
       try
       {
           int permanentDifferenceID=0;
           int taxEntityID = 0;
           int mapid = 0;

           //using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
           //{


                  Topaz.DAL.PermanentDifference permDiff;


                      for (int i = 0; i < permDiffDetails.Count; i++)
                      {

                          if ((bool)(HttpContext.Current.Session[GlobalConstant.currentDataSet]) == true && (int)(HttpContext.Current.Session[GlobalConstant.snapShotID]) == 0)
                          {
                              using (var ctx = new TopazDbContainer())
                              {

                                   try
                                 {
                                      permanentDifferenceID = permDiffDetails[i].PermanentDifferenceID;
                                      taxEntityID = permDiffDetails[i].TaxEntityID;
                                      mapid = permDiffDetails[i].MapID;

                                      permDiff = new Topaz.DAL.PermanentDifference();


                                      permDiff = ctx.PermanentDifference.Where(p => p.PermanentDifferenceID == permanentDifferenceID && p.TaxEntityID == taxEntityID && p.MapID == mapid).SingleOrDefault();
                                      permDiff.Business = permDiffDetails[i].Business;
                                      permDiff.Interest = permDiffDetails[i].Interest;
                                      permDiff.Corporate = permDiffDetails[i].Corporate;
                                      permDiff.UnallocatedTax = permDiffDetails[i].UnallocatedTax;
                                      permDiff.Total = permDiffDetails[i].Total;
                                      permDiff.ModifiedBy = permDiffDetails[i].ModifiedBy;
                                      permDiff.ModifiedDate = DateTime.Now;
                                      ctx.SaveChanges();

                              }
                           catch (System.Data.OptimisticConcurrencyException ex)
                              {
                                    permanentDifferenceID = permDiffDetails[i].PermanentDifferenceID;
                                    taxEntityID = permDiffDetails[i].TaxEntityID;
                                    mapid = permDiffDetails[i].MapID;
                                    permDiff = new Topaz.DAL.PermanentDifference();                                  
                                    ctx.Refresh(System.Data.Objects.RefreshMode.StoreWins, permDiff);
                                    permDiff = ctx.PermanentDifference.Where(p => p.PermanentDifferenceID == permanentDifferenceID && p.TaxEntityID == taxEntityID && p.MapID == mapid).SingleOrDefault();
                                    permDiff.Business = permDiffDetails[i].Business;
                                    permDiff.Interest = permDiffDetails[i].Interest;
                                    permDiff.Corporate = permDiffDetails[i].Corporate;
                                    permDiff.UnallocatedTax = permDiffDetails[i].UnallocatedTax;
                                    permDiff.Total = permDiffDetails[i].Total;
                                    permDiff.ModifiedBy = permDiffDetails[i].ModifiedBy;
                                    permDiff.ModifiedDate = DateTime.Now;
                                    ctx.SaveChanges();
                                  }


                              }
                      }


                      //ctx.ContextOptions.UseLegacyPreserveChangesBehavior = true;



                  }



               //}


           //using (UnitOfWork uow = new UnitOfWork())
           //{
           //    for (int i = 0; i < permDiffDetails.Count; i++)
           //    {
           //        if ((bool)(HttpContext.Current.Session[GlobalConstant.currentDataSet]) == true && (int)(HttpContext.Current.Session[GlobalConstant.snapShotID]) == 0)
           //        {
           //            Repository.PermanentDifferenceRepository pDiffRepo = new Repository.PermanentDifferenceRepository(uow);
           //            Topaz.DAL.PermanentDifference permDiff = pDiffRepo.GetByEntityId(permDiffDetails[i].PermanentDifferenceID, permDiffDetails[i].TaxEntityID, permDiffDetails[i].MapID);


           //            permDiff.Business = permDiffDetails[i].Business;
           //            permDiff.Interest = permDiffDetails[i].Interest;
           //            permDiff.Corporate = permDiffDetails[i].Corporate;
           //            permDiff.UnallocatedTax = permDiffDetails[i].UnallocatedTax;
           //            permDiff.Total = permDiffDetails[i].Total;
           //            permDiff.ModifiedBy = permDiffDetails[i].ModifiedBy;
           //            permDiff.ModifiedDate = DateTime.Now;
           //            pDiffRepo.ApplyChanges(permDiff);

           //        }

           //        else
           //        {
           //            int snapshotID = (int)(HttpContext.Current.Session[GlobalConstant.snapShotID]);
           //            SnapShotPermanentDifferenceRepository pDiffRepo = new SnapShotPermanentDifferenceRepository(uow);
           //            SnapShotPermanentDifference permDiff = pDiffRepo.GetByEntityId(permDiffDetails[i].PermanentDifferenceID, permDiffDetails[i].TaxEntityID, permDiffDetails[i].MapID,snapshotID);

           //            permDiff.SnapshotID = snapshotID;
           //            permDiff.Business = permDiffDetails[i].Business;
           //            permDiff.Interest = permDiffDetails[i].Interest;
           //            permDiff.Corporate = permDiffDetails[i].Corporate;
           //            permDiff.UnallocatedTax = permDiffDetails[i].UnallocatedTax;
           //            permDiff.Total = permDiffDetails[i].Total;
           //            permDiff.ModifiedBy = permDiffDetails[i].ModifiedBy;
           //            permDiff.ModifiedDate = DateTime.Now;
           //            pDiffRepo.ApplyChanges(permDiff);


           //        }
           //    }
           //    uow.SaveChanges();
               return true;
           }
       catch (Exception ex)
       {
           TopazErrorLogs.AddTopazErrorLogBL(ex, 1, 1);
           throw new TopazCustomException(GlobalConstant.errorMessage);

       }

   }

緊急の支援は大歓迎です。

4

2 に答える 2

1

これを解決する一般的な方法は、同時実行を処理するすべてのテーブルに列を追加することです。この列のデータ型はROWVERSIONまたはです。TIMESTAMPEDMX でテーブルをマップすると、タイプの新しい計算プロパティが取得byte[]され、その同時実行モードが固定に設定されます。この設定により、EF はすべての UPDATE または DELETE ステートメントに追加の WHERE 条件を追加し、その行バージョンがデータベースからレコードが読み込まれたときと同じであることを検証します。行のバージョンが同じでない場合 (別のスレッドがレコードを更新した場合)、変更によるレコードが見つからず、例外が発生します。

データベースは、レコードを自動的に更新するたびに値を変更します。エンティティがデータベースからロードされたときに取得された値をエンティティが使用していることを確認する必要があります。

于 2012-04-17T08:38:58.437 に答える
0

すべてのビューステートに謝罪し、ある程度セッションが原因であり、EntityFramework ではありませんでした。

于 2012-04-21T20:13:16.647 に答える