我正在使用实体框架和代码第一种方法构建一个Web应用程序,到目前为止我真的很喜欢它,除了一件事。初始化过程和播种数据是垃圾。
我已经按照ASP.NET MVC的建议进行了设置,在app start中调用了setinitialiser,并添加了一个自定义初始化类来添加数据,但它似乎总是无声地失败而且永远不会工作。 (数据库创建仅适用于数据init失败)
任何人都可以为此提供推荐的实践或从文件中运行sql脚本的方法。
添加数据的给定方法,特别是对于演示站点来说似乎很麻烦,我更希望能够直接从作为安装过程的一部分运行一次的文件运行数据库脚本,而不是依赖于没有任何迹象表明出现了问题。
修改
我注意到它抛出异常(idiotic datetime - > datetime2转换错误,应由实体框架处理。)
但问题的一部分可能是我的Express 2010版本没有打破错误,在调试时似乎非常错误。
但问题仍然存在。我发现它本质上是在数据库上运行sql脚本的繁琐和错误的方式。并且当有人在IIS中安装我的Web应用程序时,不希望最终设置大量的方法和类来设置演示站点。
答案 0 :(得分:2)
直到您将显示可重现的代码段,其中初始化失败而不抛出异常,我几乎不相信这种情况发生。
您可以通过使用SqlConnection
和SqlCommand
回退到经典ADO.NET来执行任何SQL脚本。只需打开文件,将命令加载到字符串中,然后使用SqlCommand或Database.ExecuteSqlCommand
执行它们。
答案 1 :(得分: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 \ Assemblies \ Microsoft.SqlServer.ConnectionInfo.dll C:\ Program Files \ Microsoft SQL Server \ 100 \ SDK \ Assemblies \ Microsoft.SqlServer.Management.Sdk.Sfc.dll C:\ Program Files \ Microsoft SQL Server \ 100 \ SDK \ Assemblies \ Microsoft.SqlServer.Smo.dll
如果您需要帮助编写数据脚本