我現在有在數據庫中的表,其構造如下所示:攔截並重定向實體保存從內的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
由於監管/日誌記錄問題,我無權更新數據庫,並且更新會破壞舊版代碼。然而,我確信我的老闆允許我更新實體,以對推進的任何數據執行這些限制。
我的想法是覆蓋SaveChanges
在DbContext
因此,如果遺留代碼嘗試添加另一行,其中CustomerId
,PartId
和OrderDate
已經存在,從而節省被取消,現有行的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();
}
這對我來說聽起來像是應該實現爲上面一層業務邏輯的東西。無論使用上下文添加行的類是什麼類型,都應該修改爲先查找行並增加計數(如果存在)。我瞭解你可能無法修改該代碼,但我只是說。恕我直言,你打開了一堆試圖覆蓋SaveChanges行爲的蠕蟲。通過這樣做你會獲得什麼?離開它的缺點是什麼? (除了明顯的)。如果存儲不是問題,我和你的老闆在一起。保持原樣。 – JuanR