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

19
我使用Entity Framework Code First开发了一个相当简单的Web应用程序。经过几个小时的努力,我意识到即使LocalDb是SQL Server Express,在使用“发布”(发布向导)时它实际上并不适用于生产环境。请注意,我正在使用EF 6.1.3,SQL Server 2014,VS 2013和IIS 7。
如果我理解正确,当您使用LocalDb点击“发布”时,您所做的只是将您的LocalDb数据库复制到您的IIS 7服务器上。我无法弄清楚为什么当我通过VS迁移更新我的LocalDb数据库时,我的生产服务器数据库没有被更新。我现在明白(并相信)这实际上是两个不同的LocalDb实例,因此不是相同的数据。
好的,无论怎样 - 我已经放弃了LocalDb并在我的机器上创建了一个真正的SQL Server 2014数据库。我已经搜索了几个小时,现在不知道该怎么做。我有一些问题:
  1. 如何使用EF管理这个新数据库?例如,假设我想添加一个新列。首先将其添加到我的LocalDb中,并进行一些测试,然后使用Add-Migration blah进行迁移,然后Update-Database... 然后我是否需要使用VS生成一个SQL脚本,然后手动在生产DB服务器上运行它?
  2. 我知道这不是最好的方法,但是除了使用entity framework的local DB之外,我可以直接将EF附加到真正的分段SQL Server数据库(测试数据库)中,跳过所有这些LocalDb?然后我是否可以使用Code-First迁移来管理它,并保持所有内容同步?
  3. 我应该使用Initializer吗?有关是否要在生产DB(例如此类)中使用这些内容,我读到了一些矛盾的报告。
很让人沮丧的是,我唯一学习这些东西的方式是通过其他感到沮丧的人的博客文章。我不明白为什么文档如此垃圾。
感谢您的帮助,抱歉我发牢骚。
4个回答

8

使用初始化器

您可以使用MigrateDatabaseToLatestVersion初始化器,以便在应用程序第一次启动后自动执行数据库模式更改(如果可能且不会有数据丢失)。

如果会发生数据丢失,则会出现错误并需要采取适当措施。这可以被覆盖以继续执行即使有数据丢失。

开发环境设置体验

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

"设置新的开发环境"体验应尽可能顺畅,除了加载解决方案、构建和运行代码库之外,最好没有或很少手动步骤。

自动化发布周期

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

如果您想要小心一点或满足一些合规性要求,可能需要进行简单的阶段性更改的是手动的“是/否”审批。

然而,在您的暂存环境中自动化测试应该可以缓解这个问题,当成功时会自动部署到生产环境 - 在一个完美的世界里;)

手动针对生产环境运行update-database需要运行它的机器访问生产数据库 - 如果您正在交互式运行它,则不太可能或不建议这种情况。如有必要,您可以将其作为自动化部署流程的一部分脚本,如果您想要比使用初始化器更多的控制权,那么初始化器似乎最适合较简单的项目(尽管这个项目似乎是这样的)。


生产环境中绝不能发生数据丢失,应该使用像TOAD SQL Compare这样的工具来迁移已知的列,数据库只需要更新即可。 - c-sharp-and-swiftui-devni

4
感谢大家的帮助,我在你们的帮助下解决了问题。对于任何对步骤感兴趣的人,以下是具体步骤。这里只列出一些额外的帮助,但以上答案真正回答了问题。这假设了我的问题设置已经完成。一旦设置好了数据库,建议您使用本地DB更新它,方法如下:
  1. 在VS2013中,转到工具->sql服务器对象资源管理器->(LocalDb)\v11.0->数据库->[database_name]->右键单击->数据比较->模式比较
  2. 在右下拉列表中,找到您的SQL数据库并测试连接,以确保其正常工作。

  3. 点击比较->更新目标(我不建议在生产数据库中这样做,但如果您只创建了一个暂存db,则可以)

  4. 如果您进入SSMS(SQL Server Management Studio),您应该会看到新表和模式比较工具制作的内容。太棒了!

  5. 如果要使用初始化程序,请随意使用,只需确保将其设置为CreateDatabaseIfNotExists或不会删除数据库的其他选项。我的意思是,我猜您可以使用任何您想要的选项,但那将失去以上步骤的目的。

  6. 右键单击您的Web项目,单击发布,使用Web部署,转到您的数据库,将目标定位到新数据库,并确保选中执行Code First迁移(这将在新数据库上运行您为本地DB完成的所有迁移)。实际上您不需要这样做。您可以将此选项保持未选中,并执行Sampath在已接受答案中建议的操作。

  7. 完成!现在您已成功转换为真正的SQL Server Express DB。

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


2
你应该有两个连接字符串,一个用于本地数据库,另一个用于生产SQL服务器。 你可以像平常开发一样,例如使用“add-migration”和“update-database”命令来操作本地数据库。在准备发布到线上时,只需更改连接字符串为生产环境的连接字符串,然后发布站点。最后运行“update-database”命令,这将同步线上数据库到你刚发布的版本。

当您需要作为部署的一部分向数据库添加大量数据时,您如何处理这些情况?结构是好的,但是当QA需要更多预先存在的数据以进行测试时,该怎么处理呢? - jrandomuser
在迁移的 Configuration.cs 中有一个 Seed 方法。在那里,您可以检查它是否是实时迁移调用(我在 Web.config 中使用键值来区分实时/测试/本地)。在 Seed 方法中,您可以通过代码手动插入到上下文中,调用存储过程或执行适合您数据输入需求的任何其他操作。 - Wurd
另外,部署到生产环境时,请不要手动更改连接字符串。相反,创建单独的配置文件(例如web.debug.config和web.release.config),并创建两个发布配置文件:一个用于测试,一个用于生产,它们使用相应的配置文件来包含相应的连接字符串! 此外,应避免从安装在您自己机器上的VS进行生产环境部署,而是使用脚本进行部署是最佳选择!该脚本可以使用migrate.exe进行部署,并可包含在持续部署流水线中! - Syed Waqas

0
如果您在本地使用SQL Express版本,则可以轻松将其迁移到SQL生产服务器。 SQL生产服务器可以是SQL Azure或您自己的生产服务器。 A 1. 您只需要将本地连接字符串更改为生产环境,并在包管理器上运行以下命令。然后,所有未更新的迁移脚本都将在生产环境上运行。
PM> Update-Database

A 2 : 我不建议使用这种方法。

A 3 : 你可以像这样做:

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

24
这个答案对于生产环境来说不太合适。在公司的环境中,你应该如何运行包管理器控制台呢?不能使用Visual Studio来访问生产数据库! - Banoona
你应该使用类似于Toad Compare的工具。 - c-sharp-and-swiftui-devni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接