【问题标题】:EF 4.1 Code First Initialization - AlternativeEF 4.1 代码优先初始化 - 替代方案
【发布时间】:2011-04-24 13:34:44
【问题描述】:

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

我已经按照 ASP.NET MVC 的建议进行了设置,在应用程序启动时调用了 setinitialiser,并使用了一个自定义初始化类来添加数据,但它似乎总是默默地失败并且永远不会工作。 (数据库创建工作只是数据初始化失败)

谁能为此提供推荐的做法或从文件运行 sql 脚本的方法。

添加数据的给定方法,特别是对于演示站点,似乎很麻烦,我希望能够直接从作为安装过程的一部分运行一次的文件直接运行数据库脚本,而不是依赖于失败,没有任何迹象表明出了什么问题。

编辑

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

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

但问题仍然存在。我发现它本质上是在数据库上运行 sql 脚本的一种繁琐且错误的方式。当有人在 IIS 中安装我的 Web 应用程序时,不想为了设置演示站点而使用大量方法和类。

【问题讨论】:

  • 拥有一个静态 sql 脚本不会首先破坏代码优先的目的吗?我也不能说我偶然发现了任何播种问题,有关问题和代码 sn-ps 的更多详细信息会有所帮助。
  • 没有那么多代码来粘贴该方法非常简单,我可以在种子方法中放置断点并且它们可以工作,但是 context.savechanges 似乎永远不会工作。
  • 如果没有太多要粘贴的代码,你为什么拒绝这样做?
  • 因为别人这样做会惹恼我

标签: asp.net asp.net-mvc entity-framework entity-framework-4.1


【解决方案1】:

如果您想从初始化程序运行 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

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

SP_Generate_Inserts

【讨论】:

  • 是的,我正在考虑使用 sql 脚本,但没有考虑使用 SMO 库。看起来这可能是我选择的路径。
【解决方案2】:

直到您将显示可重现的代码 sn-p 初始化失败而不抛出异常时,我几乎不相信会发生这种情况。

您始终可以通过使用 SqlConnectionSqlCommand 回退到经典 ADO.NET 来执行任何 SQL 脚本。只需打开文件,将命令加载到字符串中,然后使用 SqlCommand 或Database.ExecuteSqlCommand 执行它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多