2011-03-31 51 views
1

我有更新主細節記錄的操作方法。當數據首次從視圖到控制器時,我從db中選擇以前的記錄並調用存儲庫的delete方法。Linq to Sql在同一事務中添加和刪除

public ActionResult sale(int id, SaleRecord _SaleRecord,int? PositionID) 
     { 
      SalesRepository _SalesRepository = new SalesRepository(); 
      if (ModelState.IsValid) 
      { 
       List<long> prevSaleIDs = _SaleRecord.Items.Where(y => y.ActualSaleID > 0).Select(x => x.ActualSaleID).Distinct().ToList(); 
       foreach (var SaleID in prevSaleIDs) 
       { 
        var dbData = _SalesRepository.GetSale(SaleID); 
        _SalesRepository.DeleteSaleItems(dbData.mktActualSaleItems.ToList()); 
        _SalesRepository.DeleteActualSales(dbData); 
       } 
----- 
----- 
} 

把記錄刪除後,我致電的UpdateModel準備新的記錄,並把它插入

public ActionResult sale(int id, SaleRecord _SaleRecord, int? PositionID) 
{ 
    //as above 
    mktActualSale _Sales = new mktActualSale(); 
       UpdateModel(_Sales, "_SaleRecord"); 
       _Sales.mktActualSaleItems.AddRange(_SaleRecord.Items.Where(z => z.SalesQuantity != 0).Select(x => new mktActualSaleItem { SalesQuantity = x.SalesQuantity, SKUID = x.SKUID })); 
       _SalesRepository.Add(_Sales); 
       _SalesRepository.Save(); 
} 

但保存被調用時,它給我的異常,告訴唯一鍵約束被侵犯D b。這個約束被違反的原因是以前的記錄不會從數據庫中刪除,而只是想在其上添加另一條記錄。我該如何解決這個問題
關於

回答

2

那麼爲什麼在添加新記錄之前不要調用_SalesRepository.Save();

更新:

但是是不是更好做更新,而不是刪除和添加。 只需獲取記錄並使用try catch將它們全部更新,然後如果一切正常都可以保存。

希望這對我有幫助

+0

它不會違反交易的完整性。假設我們在保存之前添加了記錄,並且在添加記錄時我們發現異常,我們不會在db級別處於不一致的狀態 – 2011-03-31 15:21:39

+0

然後您應該使用Update而不是刪除並添加。只需獲取記錄並使用'try catch'全部更新它們,然後如果一切正常都可以保存。希望這有助於:) – 2011-03-31 17:06:51

+0

實際上要更新的記錄是主詳細信息,詳細信息部分用戶可能已添加一些新記錄,刪除舊記錄或完成了這兩項操作。所以,在這種情況下,我相信刪除後添加記錄更有意義,然後檢查舊記錄 – 2011-03-31 19:26:57