向通過EF 4.1的代碼優先方法創建的表格添加觸發器的最佳方式是什麼?EF 4.1代碼 - 首先在表格中添加觸發器
我正在考慮的方法是在OnModelCreating或Db上下文初始化時執行自定義SQL查詢。
有更好的主意嗎?
向通過EF 4.1的代碼優先方法創建的表格添加觸發器的最佳方式是什麼?EF 4.1代碼 - 首先在表格中添加觸發器
我正在考慮的方法是在OnModelCreating或Db上下文初始化時執行自定義SQL查詢。
有更好的主意嗎?
我不完全確定你的意思。如果你想在表上使用一個實際的SQL觸發器,那麼我會在SQL中創建正常的觸發器。如果你的意思是你想要在你的代碼中進行某種處理/更新,只要你修改了其中一個實體集合,那麼我想你會想要做一個自定義方法,只要該實體集合被更新就會被調用。
使用將執行的自定義初始化程序CREATE TRIGGER
如果您希望EF爲您創建觸發器(similar code like here),SQL命令是唯一的選項。另外不要忘記在觸發代碼的開始處包含SET NOCOUNT ON
。
但是觸發邏輯有更復雜的問題。如果你想要觸發器來修改傳遞給數據庫的數據,你必須明白觸發器所做的更改不會反映在當前的上下文中。上下文仍將只知道您傳遞給數據庫的數據。這通常可以通過設置更新觸發器的屬性爲DatabaseGeneratedOption.Computed
或插入的DatabaseGeneratedOption.Identity
來解決。在這種情況下,您無法修改應用程序中的屬性,並且必須在數據庫中對其進行修改。 EF將確保這些屬性在修改後被選擇並傳遞給實體。問題是this doesn't work with code-first。
我確實需要一個表上的實際觸發器。如果我直接在SQL中創建它,它會因爲這個「DropCreateDatabaseIfModelChanges」而丟失。 – Dmitri 2011-05-06 15:22:04
如果需要使用SQL觸發器,則可以始終創建腳本,並在重新創建表時運行它。雖然這很糟糕。拉迪斯拉夫說得很好 - 任何時候你的觸發器運行,你都需要刷新你的上下文。如果它可以用代碼來完成,我想你會爲自己節省一些頭痛。 – AllenG 2011-05-06 15:32:03
這完全沒有道理......爲什麼不利用SQL與從代碼中向數據庫進行二次調用?編寫和執行的代碼更少,它使SQL執行它應該執行的操作,即觸發器。更何況,這對於數據庫來說是少之又少的。 – IyaTaisho 2013-02-27 16:14:03