3

我建立使用實體框架和代碼優先的方法和我的Web應用程序真的很喜歡它,到目前爲止,除了一兩件事。初始化過程和播種數據是垃圾。EF 4.1代碼首先初始化 - 替代

我已經將它設置爲推薦使用ASP.NET MVC與setinitialiser被稱爲應用程序啓動和自定義初始化類添加數據,但它似乎總是默默地消失,從來沒有工作。 (數據庫創建工作不僅僅是數據初始化失敗)

任何人都可以對這個或運行從一個文件中的SQL腳本的方式提供推薦paractice。

給定的添加數據的方法,尤其是演示站點的方法看起來很麻煩,我寧願直接從作爲安裝過程的一部分運行一次的文件運行數據庫腳本,而不是依賴於過程沒有任何跡象表明某些事情已經出錯。

編輯

我已經注意到它拋出異常(愚蠢的日期時間 - >應該由實體框架來處理DATETIME2轉換錯誤)

但問題的一部分,可能是我的版本明年2010年不會出現錯誤,它在調試時似乎很麻煩。

但問題仍然有效。我發現它本質上是在數據庫上運行sql腳本的一種繁瑣和錯誤的方式。當有人在IIS中安裝我的Web應用程序時,不希望結束一大堆方法和類來設置演示站點。

+0

不會有一個靜態的sql腳本首先打敗了code-first的目的嗎?我不能說我遇到了種子問題,關於這個問題的更多細節和代碼片段會有所幫助。 – 2011-04-24 16:40:57

+0

沒有太多的代碼要粘貼這個方法非常簡單,我可以在種子方法中插入斷點並且它們可以工作,但context.savechanges似乎永遠不會工作。 – eaglestorm 2011-04-25 02:53:04

+0

如果沒有太多的代碼要粘貼,爲什麼你拒絕這樣做? – 2011-04-25 03:18:31

回答

2

如果你想從你的初始化運行SQL腳本,我會建議增加

using Microsoft.SqlServer.Management.Smo; 
using Microsoft.SqlServer.Management.Common; 


     string scriptDirectory = HttpContext.Current.Server.MapPath("~/SqlScripts"); 
     string sqlConnectionString = context.Database.Connection.ConnectionString; 
     DirectoryInfo di = new DirectoryInfo(scriptDirectory); 
     FileInfo[] rgFiles = di.GetFiles("*.sql"); 
     foreach (FileInfo fi in rgFiles) 
     { 
      FileInfo fileInfo = new FileInfo(fi.FullName); 
      using (TextReader reader = new StreamReader(fi.FullName)) 
      { 
       using (SqlConnection connection = new SqlConnection(context.Database.Connection.ConnectionString)) 
       { 
        Server server = new Server(new ServerConnection(connection)); 
        server.ConnectionContext.ExecuteNonQuery(reader.ReadToEnd()); 
       } 
       reader.Close(); 
       reader.Dispose(); 
      } 
     } 

之所以使用SQLServer的管理對象是,你可以使用腳本中的「GO」。然後它變得非常容易從SSMS腳本並將腳本粘貼到您的SqlScripts目錄中。

您可以找到SMO庫在:

C:\ Program Files文件\ Microsoft SQL Server的\ 100個\ SDK \組件\ Microsoft.SqlServer.ConnectionInfo.dll C:\ Program Files文件\ Microsoft SQL Server的\ 100 \ SDK \組件\ Microsoft.SqlServer.Management.Sdk.Sfc.dll C:\ Program Files文件\ Microsoft SQL Server的\ 100 \ SDK \組件\ Microsoft.SqlServer.Smo.dll

,如果你需要幫助腳本化您的數據

SP_Generate_Inserts

+0

是的,我在考慮使用sql腳本,但沒有考慮使用SMO庫。它看起來可能是我選擇的路徑。 – eaglestorm 2011-04-25 02:55:13

2

直到你將顯示可重複的代碼片段,其中初始化失敗而沒有拋出異常,我幾乎不相信會發生這種情況。

您可以始終使用SqlConnectionSqlCommand回退到經典的ADO.NET來執行任何SQL腳本。只要打開該文件,加載命令轉換爲字符串,並用的SqlCommand或Database.ExecuteSqlCommand執行它們。