2016-11-16 44 views
0

我現在有在數據庫中的表,其構造如下所示:攔截並重定向實體保存從內的SaveChanges

Orders 
    OrderId int , --Primary Key 
    CustomerId int, 
    PartId int, 
    OrderDate Date, 
    Quantity int 

不幸的是,因爲的OrderId設定作爲主鍵代替具有客戶ID的組合鍵的,PARTID和訂購日期我們在數據庫中的以下的很多實例:

OrderId | CustomerId | PartId | OrderDate | Quantity 
1  | 23   | 45  | 2016-11-16 | 1 
2  | 23   | 45  | 2016-11-16 | 1 
3  | 23   | 45  | 2016-11-16 | 1 
4  | 26   | 30  | 2016-10-25 | 1 
5  | 26   | 30  | 2016-10-25 | 1 

相反的:

OrderId | CustomerId | PartId | OrderDate | Quantity 
1  | 23   | 45  | 2016-11-16 | 3 
4  | 26   | 30  | 2016-10-25 | 2 

由於監管/日誌記錄問題,我無權更新數據庫,並且更新會破壞舊版代碼。然而,我確信我的老闆允許我更新實體,以對推進的任何數據執行這些限制。

我的想法是覆蓋SaveChangesDbContext因此,如果遺留代碼嘗試添加另一行,其中CustomerIdPartIdOrderDate已經存在,從而節省被取消,現有行的Quantity柱增加。到目前爲止,我有以下但我不確定如何取消保存,更新現有的行,並強制該行從SaveChanges保存。

public override int SaveChanges() 
{ 

    var PartAssemblyList = ChangeTracker.Entries() 
          .Where(x => x.Entity is Order && 
             x.State == EntityState.Added); 

    foreach (var entity in PartAssemblyList) 
    { 
     if (/*RowExists*/) 
     { 
      //Cancel Save (entity.State = EntityState.Unchanged)? 
      //Update Quantity of Existing Row 
      //Set existing row to save 
     } 
    } 

    return base.SaveChanges(); 
} 
+0

這對我來說聽起來像是應該實現爲上面一層業務邏輯的東西。無論使用上下文添加行的類是什麼類型,都應該修改爲先查找行並增加計數(如果存在)。我瞭解你可能無法修改該代碼,但我只是說。恕我直言,你打開了一堆試圖覆蓋SaveChanges行爲的蠕蟲。通過這樣做你會獲得什麼?離開它的缺點是什麼? (除了明顯的)。如果存儲不是問題,我和你的老闆在一起。保持原樣。 – JuanR

回答

1

我認爲首要EF是一個壞主意,因爲你可能比其他0​​其他實體使用。但是,爲什麼你不打包SaveChanges()電話並自己進行添加/更新工作?

public void AddUpdateOrder(Order o) 
{ 
    using(var ctx = new YourDataModelContext()) 
    { 
     if(ctx.Orders.Any(x => x.OrderId == o.OrderId && x.CustomerId == o.CustomerId && x.PartId == o.PartId && x.OrderDate == o.OrderDate)) 
     { 
      var e = ctx.Orders.Where(x => x.OrderId == o.OrderId && x.CustomerId == o.CustomerId && x.PartId == o.PartId && x.OrderDate == o.OrderDate).FirstOrDefault(); 
      e.Quantity += 1; 
      ctx.Entry(e).State = Modified; 
     } 
     else 
     { 
      Order e = new Order() { OrderId = o.OrderId, CustomerId = o.CustomerId, PartId = o.PartId, OrderDate == o.OrderDate, Quantity = 1}; 
      ctx.Orders.Add(e); 
     } 
     ctx.SaveChanges(); 
    } 
} 
+0

謝謝。我想我要編輯SaveChanges會很複雜。這是最好的方式。 – coffeecop