2013-10-21 86 views
0

我認爲我現在有幾個類似的問題,但我現在對Google搜索和閱讀很困惑。由於我有一個代碼優先的方法,我添加了遷移支持,更新到數據庫,現在我需要一些討厭的東西,比如觸發器,存儲過程和視圖。據我瞭解,我需要編寫SQL創建觸發器並創建存儲過程作爲字符串到我的C#代碼第一代碼。但是哪裏?我需要添加它們(如靜態或常量字符串)?我還需要編寫drop triggers/stored procs字符串嗎?以及如何將它們整合到下一個遷移步驟中?有沒有人知道一個真正有用的關於這個話題的逐步博客?EF代碼第一觸發器支持的最佳方式

我得到了一個建議,用「add-migration」命令生成下一個遷移步驟,然後用觸發器定義更新Up()和Down()方法。這很明顯,但是距離代碼第一個觀點有點遠,我害怕表定義和表觸發器(和存儲過程)將被分開。另一個建議說覆蓋上下文OnModelCreating()...但我不能看到它何時將執行,如何鏈接到特定的遷移步驟...

而且請不要爭論「使用觸發器一個愚蠢的東西「,因爲我的問題比這更廣泛......如何將任何先進的sql server」對象「添加到第一個不容易在C#中定義爲代碼的代碼中?

回答

1

我最近有類似的問題,我發現最好的解決方案是從(最初)空的遷移中運行腳本。我將腳本放在一個文件中,並將其作爲資源添加到項目中。

我不得不做的一個有趣的技巧是將特殊的分隔符放在腳本文件中,因爲GO語句不是T-SQL語句。我使用術語GO - BATCH作爲批處理分隔符,以便它可以在SQL Server Management Studio和代碼中使用。在代碼中,我簡單地通過這個分離拆分腳本並運行多個查詢是這樣的:

public partial class CodeHostDiscovery : DbMigration 
{ 
    public override void Up() 
    { 
     var batches = Properties.Resources.CodeHostDiscoverySqlScript.Split(new string[] {"GO--BATCH--"}, StringSplitOptions.None); 
     foreach (var batch in batches) 
     { 
      Sql(batch);  
     } 
    } 

    public override void Down() 
    { 
    } 
} 

下面是從SQL腳本片段:

CREATE SCHEMA SystemServices 

GO--BATCH-- 

CREATE TABLE [SystemServices].[HeartbeatConfiguration] (

我不期望的Code First提供更好設施要做到這一點,因爲Code First背後的想法是你不需要存儲過程,觸發器或其他任何東西。你只需使用Code First。當然,這並不總是當然的,爲此你可以在數據庫上運行SQL。

+0

Ahm ...所以你建議直接向Up()方法添加新代碼。但是當(例如)您想要稍後定義其他觸發器時,您必須爲每個遷移定義不同的腳本文件?你將觸發器的定義遠離代碼第一個源代碼......我看到了優點和缺點...但是,謝謝你的答案! :) –