2011-05-06 148 views

回答

1

我不完全確定你的意思。如果你想在表上使用一個實際的SQL觸發器,那麼我會在SQL中創建正常的觸發器。如果你的意思是你想要在你的代碼中進行某種處理/更新,只要你修改了其中一個實體集合,那麼我想你會想要做一個自定義方法,只要該實體集合被更新就會被調用。

+0

我確實需要一個表上的實際觸發器。如果我直接在SQL中創建它,它會因爲這個「DropCreateDatabaseIfModelChanges」而丟失。 – Dmitri 2011-05-06 15:22:04

+0

如果需要使用SQL觸發器,則可以始終創建腳本,並在重新創建表時運行它。雖然這很糟糕。拉迪斯拉夫說得很好 - 任何時候你的觸發器運行,你都需要刷新你的上下文。如果它可以用代碼來完成,我想你會爲自己節省一些頭痛。 – AllenG 2011-05-06 15:32:03

+1

這完全沒有道理......爲什麼不利用SQL與從代碼中向數據庫進行二次調用?編寫和執行的代碼更少,它使SQL執行它應該執行的操作,即觸發器。更何況,這對於數據庫來說是少之又少的。 – IyaTaisho 2013-02-27 16:14:03

17

使用將執行的自定義初始化程序CREATE TRIGGER如果您希望EF爲您創建觸發器(similar code like here),SQL命令是唯一的選項。另外不要忘記在觸發代碼的開始處包含SET NOCOUNT ON

但是觸發邏輯有更復雜的問題。如果你想要觸發器來修改傳遞給數據庫的數據,你必須明白觸發器所做的更改不會反映在當前的上下文中。上下文仍將只知道您傳遞給數據庫的數據。這通常可以通過設置更新觸發器的屬性爲DatabaseGeneratedOption.Computed或插入的DatabaseGeneratedOption.Identity來解決。在這種情況下,您無法修改應用程序中的屬性,並且必須在數據庫中對其進行修改。 EF將確保這些屬性在修改後被選擇並傳遞給實體。問題是this doesn't work with code-first

+0

在我目前的情況下,我需要更新其中一個表中的「DateModified」列。 「DateModified」的值將不會被當前上下文使用。 – Dmitri 2011-05-06 15:40:36

+0

實際上正在考慮它,因爲POCO對象被上下文跟蹤,我可以利用它來更新我的時間戳嗎? – Dmitri 2011-05-06 15:41:53

+0

*「DateModified」不會被上下文使用*不符合您只定義上下文使用的列的代碼優先方法。 – 2011-05-06 15:49:03