先用生产数据库部署实体框架代码

Posted

技术标签:

【中文标题】先用生产数据库部署实体框架代码【英文标题】:Deploying entity framework code first with production database 【发布时间】:2017-01-23 14:29:44 【问题描述】:

我首先使用实体​​框架代码开发了一个非常简单的网络应用程序。经过数小时的挫折后,我意识到,尽管 localdb 是 SQL Server Express,但在使用“发布”(发布向导)时,它实际上并不意味着用于生产。仅供参考,我使用的是 EF 6.1.3、SQL Server 2014、VS 2013 和 IIS 7。

如果我理解正确,当您单击使用 localdb 发布时,您真正要做的就是将 localdb 数据库复制到 IIS 7 服务器。我不明白为什么当我通过 VS 迁移更新我的 lodaldb 数据库时,我的生产服务器数据库没有被更新。我理解(并且现在相信)它实际上是 localdb 的两个不同实例,因此不是相同的数据。

好吧 - 我已经完成了 localdb 并在我的机器上创建了一个真正的 SQL Server 2014 db。我已经用谷歌搜索了几个小时,现在不知道该怎么做。我有一些问题:

    如何使用 EF 管理这个新数据库?例如,假设我想添加一个新列。首先,我将它添加到我的 localdb,进行一些测试,然后使用 Add-Migration blah 然后 Update-Database 进行迁移...然后我是否必须使用 VS 生成一个 SQL 脚本,然后在生产数据库服务器上手动运行它?

    我知道这不是很好,但我可以不将本地数据库与实体框架一起使用,而是将 EF 附加到一个真正的暂存 SQL Server 数据库(一个测试数据库)并跳过所有这些 localdb 公牛*** *?那么我可以使用代码优先迁移来管理它并保持一切同步吗?

    我应该使用初始化程序吗?我已经阅读了关于是否将这些用于生产数据库(比如这个)的相互矛盾的报告

    公共类 PricedNotesInitializer: MigrateDatabaseToLatestVersion<...>

令人沮丧的是,我了解这些东西的唯一方法是通过其他人的博客文章感到沮丧。我不明白为什么文档这么垃圾。

感谢您的帮助,对咆哮感到抱歉。

【问题讨论】:

【参考方案1】:

使用初始化器

您可以使用 MigrateDatabaseToLatestVersion 初始化程序,以便在部署后首次启动应用程序时自动完成对数据库的架构更改(如果可能不会丢失数据)。

如果发生数据丢失,您将收到错误消息并必须采取适当的措施。即使数据丢失,也可以覆盖此设置。

开发环境搭建经验

正如其他答案已经指出的那样,每个环境都需要一个连接字符串,因此 LocalDB 适合开发,我什至鼓励它,因为它可以为任何新开发人员自动创建和初始化(并使用测试数据播种)需要通过从源代码构建和运行应用程序来开发或调试它。

“设置新的开发环境”体验应该尽可能流畅,除了加载解决方案、构建和运行代码库之外,手动步骤尽可能少,最好是零。

自动化您的发布周期

您的部署和发布管道应该是自动的,不需要任何可能被错误执行、被遗忘或更糟的手动命令。

如果您想谨慎行事或满足某些合规性要求,手动步骤可能是对分阶段更改进行简单的“是/否”批准。

然而,您的暂存环境中的自动化测试应该可以缓解这种情况,并且当成功自动部署到生产环境时——在一个完美的世界中;)

针对生产手动运行 update-database 要求任何正在运行的机器都可以访问生产数据库 - 如果您以交互方式运行它,这是不太可能或不推荐的情况。如果需要,您可以将 script it 作为自动部署管道的一部分,如果您希望对它进行更多控制而不是使用初始化程序,这似乎最适合更简单的项目(尽管这似乎是)。

【讨论】:

【参考方案2】:

感谢大家的帮助。我在你们的帮助下想通了。对于任何对这些步骤感兴趣的人,都在这里。我只是在这里列出一些额外的帮助,但上面的答案确实回答了这个问题。这假设了我的问题中的设置。设置好数据库后,我建议您使用本地数据库更新它,如下所示:

    在VS2013中,进入Tools -> sql server object explorer -> (LocalDb)\v11.0 -> databases -> [database_name] -> 右键 -> Data Comparison -> schema compare

    在右侧下拉菜单中,找到您的 SQL 数据库并测试连接以确保其正常工作。

    单击比较 -> 更新目标(我不建议将其用于生产数据库,但如果它是您刚刚创建的暂存数据库,那很好)

    如果您使用 SSMS (SQL Server Management Studio),您应该会看到新表以及架构比较工具所做的任何事情。太好了!

    如果您想使用初始化程序,请继续,只需确保将其设置为 CreateDatabaseIfNotExists 或不会删除数据库的内容。我的意思是我猜你可以使用任何你想要的东西,但这会破坏上述步骤的目的。

    右键单击您的 Web 项目,单击发布,使用 Web 部署,转到您的数据库,定位您的新数据库,确保选中 Execute Code First Migrations(这将运行所有迁移你已经为你的新数据库上的 localdb 完成了)。您实际上不必这样做。您也可以不选中此选项,并按照 Sampath 在接受的答案中建议的操作。

    完成!现在您已成功转换为真正的 SQL Server Express 数据库。

要管理您的数据库,只需按照上面的答案进行操作。或者,再次使用发布向导,确保选中 Execute Code First Migrations 并发布!

【讨论】:

【参考方案3】:

您应该有两个连接字符串,一个用于本地数据库,一个用于生产 SQL 服务器。

您应该正常开发,例如为您的 localdb 使用 add-migrationupdate-database

然后,当您准备发布到现场时,您是否应该将连接字符串更改为现场连接字符串。发布您的网站。然后运行update-database 命令。这会将您的实时数据库与您刚刚发布的数据库同步。

【讨论】:

如何处理在部署过程中需要向数据库添加大量数据的情况?结构很好,花花公子,但是您如何处理 QA 需要大量预先存在的数据才能进行测试的情况? 迁移 Configuration.cs 中有一个 Seed 方法。在那里你会检查它是否是一个实时迁移调用(我在我的 Web.config 中使用一个键值来表示 live/test/local)。在 Seed 方法中,您可以通过代码手动插入 Context、调用存储过程或执行任何其他适合您数据输入需求的操作。 另外,在部署到生产环境时不要手动更改连接字符串。相反,创建单独的配置文件(例如,web.debug.config 和 web.release.config)并创建 2 个发布配置文件;一个用于测试,一个用于生产,使用包含相应连接字符串的相应配置文件!此外,应避免从安装在您自己机器上的 VS 部署到生产环境,最好使用脚本进行部署!该脚本可以使用 migrate.exe 进行部署,并且可以包含在持续部署管道中!【参考方案4】:

如果您在本地使用SQL express 版本,则可以很容易地将其迁移到 SQL 生产服务器。SQL 生产服务器可以是 SQL Azure 或您自己的生产服务器。

A 1. 您只需将local connection string 更改为production 并在package manager 上运行以下命令。然后,您所有未更新的迁移脚本都将在生产环境中运行。

PM> Update-Database

A 2 :我不推荐这种方法。

A 3:你可以这样做:

 Database.SetInitializer(new CreateDatabaseIfNotExists<YourDbContext>());

【讨论】:

这个答案不适合生产。您将如何在企业环境中运行包管理器控制台?您不能使用 Visual Studio 访问生产数据库!

以上是关于先用生产数据库部署实体框架代码的主要内容,如果未能解决你的问题,请参考以下文章

实体框架 - 迁移 - 代码优先 - 每次迁移播种

实体框架 6 代码优先触发器

在生产环境中使用代码优先降级(回滚)数据库

实体框架核心问题 - 更新数据库创建“用户”模式

使用 SQL Server 数据库和实体框架错误的 Windows 应用程序部署

独立于模式的实体框架代码优先迁移