嗯,這裏是我的情況:EF5:如何更改默認刪除功能來實現自己的
我們有我們不希望曾經刪除的數據表。有一個名爲isDeleted的列應該被更新,而不是刪除它。
我想用EF5開發附帶的網絡應用程序,但我在那裏遇到問題。我如何實施這一限制?
我可以使用存儲過程來刪除和選擇,但我希望能夠使用EF中的標準功能,只是改變它們的工作方式。哪種方式不那麼艱難,我有什麼選擇可以實現我想要的,因爲我猜我不是第一個要求這個的人?
嗯,這裏是我的情況:EF5:如何更改默認刪除功能來實現自己的
我們有我們不希望曾經刪除的數據表。有一個名爲isDeleted的列應該被更新,而不是刪除它。
我想用EF5開發附帶的網絡應用程序,但我在那裏遇到問題。我如何實施這一限制?
我可以使用存儲過程來刪除和選擇,但我希望能夠使用EF中的標準功能,只是改變它們的工作方式。哪種方式不那麼艱難,我有什麼選擇可以實現我想要的,因爲我猜我不是第一個要求這個的人?
您可以重寫您的DbContext的SaveChanges方法。例如。你想禁止刪除產品。您可以保存實體請將isDeleted標誌設置爲true而非將其刪除:
public override int SaveChanges()
{
var deletedPersonEntries = ChangeTracker.Entries<Person>()
.Where(e => e.State == EntityState.Deleted);
foreach (var e in deletedPersonEntries)
{
e.State = EntityState.Unchanged;
e.Entity.IsDeleted = true;
}
return base.SaveChanges();
}
另一種選擇 - 提高異常,如果有人試圖刪除產品:
if (deltedProductEntries.Any())
throw new Exception("You should not delete products!");
你也可以簡單地設置實體狀態不變,但我不認爲它是非常好的解決方案。
對於第三種選擇,我會'e.State = EntityState.Unchanged; e.Entity.IsDeleted = true;'這樣只更新'IsDeleted',而不是其他所有內容。 – hvd
@ hvd同意,很好的建議 –
CREATE VIEW Foo
AS
SELECT
f.Id,
f.Bar,
f.Baz,
f.Qux
FROM Foo_Table
Where f.Deleted = 0;
CREATE TRIGGER Foo_Delete
ON Foo
Instead of Delete
AS
BEGIN
Update
Foo_Table f
SET
f.Deleted = 1
WHERE
f.Id IN (SELECT Id from Deleted)
END;
你可以這樣說:
你可以找到這個答案的工作代碼: How to soft delete using Entity Framework Code First
你也可以使用存儲過程,而不是在步驟2和3中使用的代碼 - 我一直在尋找如何EF6 generates the stored procedures for you。您添加代碼,看起來像這樣:
modelBuilder.Entity<AdministrativeArea>().MapToStoredProcedures();
並導致包括該遷移:
CreateStoredProcedure(
"dbo.AdministrativeArea_Delete",
p => new
{
ID = p.Int(),
},
body:
@"DELETE [dbo].[AdministrativeAreas]
WHERE ([ID] = @ID)"
);
現在是從一個刪除一個改變在遷移的SQL的情況下更新。它不會太艱鉅的文字做/替換,但不會是冷靜,如果我們可以改變用於生成CreateStoredProcedure
調用模板?....
我不寒而慄表明這一點,但你考慮觸發器?你可以做'而不是刪除'。 –
是的,但下一個選擇仍然會得到的數據..我想要的是所有選擇的電話忽略這些「刪除」行 – sergio
@Sergio你現在談論兩個不同的東西,軟刪除數據和篩選出的記錄被「刪除」。 – SOfanatic