Asp.net EF 4.1代码首次初始化-备选方案

Asp.net EF 4.1代码首次初始化-备选方案,asp.net,asp.net-mvc,entity-framework,entity-framework-4.1,Asp.net,Asp.net Mvc,Entity Framework,Entity Framework 4.1,我正在使用实体框架和代码优先的方法构建一个web应用程序,到目前为止,我非常喜欢它,除了一件事。初始化过程和种子数据都是垃圾 我已经按照ASP.NET MVC的建议设置了它,在app start中调用setinitialiser,并使用自定义初始化类来添加数据,但它似乎总是无声地失败,永远不会工作。(数据库创建正常,但数据初始化失败) 任何人都可以为此提供推荐的方法,或者提供从文件运行sql脚本的方法 给定的添加数据的方法(尤其是对于演示站点)似乎很麻烦,我更希望能够直接从作为安装过程一部分运行

我正在使用实体框架和代码优先的方法构建一个web应用程序,到目前为止,我非常喜欢它,除了一件事。初始化过程和种子数据都是垃圾

我已经按照ASP.NET MVC的建议设置了它,在app start中调用setinitialiser,并使用自定义初始化类来添加数据,但它似乎总是无声地失败,永远不会工作。(数据库创建正常,但数据初始化失败)

任何人都可以为此提供推荐的方法,或者提供从文件运行sql脚本的方法

给定的添加数据的方法(尤其是对于演示站点)似乎很麻烦,我更希望能够直接从作为安装过程一部分运行一次的文件运行数据库脚本,而不是依赖于一个没有任何错误指示的失败过程

编辑

我注意到它抛出了异常(愚蠢的datetime->datetime2转换错误,应该由实体框架处理)

但部分问题可能是我的Express2010版本没有出现错误,调试时似乎有很多错误


但问题依然存在。我发现在数据库上运行sql脚本是一种既麻烦又有缺陷的方法。我也不想在别人在IIS中安装我的web应用程序时,仅仅为了建立一个演示站点而使用大量的方法和类。

直到您显示可复制的代码片段,其中初始化失败而不引发异常,我几乎不相信会发生这种情况


通过使用
SqlConnection
SqlCommand
返回到经典的ADO.NET,您始终可以执行任何SQL脚本。只需打开文件,将命令加载到字符串中,并使用SqlCommand或
数据库执行它们。ExecuteSqlCommand

如果要从初始值设定项运行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”。然后,从SSM编写脚本并将脚本粘贴到SqlScripts目录变得非常容易

您可以在以下位置找到SMO库:

C:\Program Files\Microsoft SQL Server\100\SDK\Assembly\Microsoft.SqlServer.ConnectionInfo.dll C:\Program Files\Microsoft SQL Server\100\SDK\Assembly\Microsoft.SqlServer.Management.SDK.Sfc.dll C:\Program Files\Microsoft SQL Server\100\SDK\Assembly\Microsoft.SqlServer.Smo.dll

如果您需要帮助编写数据脚本


拥有一个静态sql脚本不会首先挫败代码优先的目的吗?我也不能说我在种子设定方面遇到了任何问题,更多关于这个问题的细节和代码片段会有所帮助。没有太多的代码可以粘贴方法非常简单,我可以在种子设定方法中设置断点,它们可以工作,但context.savechanges似乎永远不会工作。如果没有太多的代码可以粘贴,你为什么不这么做?因为别人这么做会让我很恼火是的,我在考虑使用sql脚本,但没有考虑使用SMO库。看起来这可能是我选择的道路。