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执行它们。