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

时间:2016-09-15 14:06:07

标签: c# mysql sql-server database entity-framework

我首先使用实体​​框架代码开发了一个非常简单的Web应用程序。我意识到经过几个小时的挫折之后,即使localdb是SQL Server Express,它实际上并不意味着在使用'publish'(发布向导)时与生产一起使用。仅供参考我使用的是EF 6.1.3,SQL Server 2014,VS 2013和IIS 7。

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

没问题 - 我已经完成了localdb,我在我的机器上创建了一个真正的SQL Server 2014数据库。我用Google搜索了几个小时,无法弄清楚现在要做什么。我有一些问题:

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

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

  3. 我应该使用初始化程序吗?我读过有关是否将这些用于生产数据库(如此)的相互矛盾的报告

    public class PricedNotesInitializer:MigrateDatabaseToLatestVersion< ...,...> { }

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

    感谢您的帮助,感谢抱歉。

4 个答案:

答案 0 :(得分:3)

使用初始化程序

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

如果发生数据丢失,您将收到错误并且必须采取适当的措施。即使数据丢失,也可以重写此操作。

开发环境设置体验

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

"建立新的开发环境"除了加载解决方案,构建和运行代码库之外,使用尽可能少且优选零手动步骤的经验应尽可能顺利。

自动化您的发布周期

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

如果您想要小心或满足某些合规性要求,可以采用手动步骤对分阶段更改进行简单的是/否批准。

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

针对生产手动运行update-database要求运行的任何计算机都可以访问生产数据库 - 如果您以交互方式运行它,我会说这是一个不太可能或不推荐的方案。如果需要,您可以script it作为自动部署管道的一部分,如果您想要比使用初始化程序更多地控制它,这似乎最适合于更简单的项目(尽管这似乎是这样)。

答案 1 :(得分:2)

如果您在本地使用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>());

答案 2 :(得分:2)

您应该有两个连接字符串,一个用于localdb,另一个用于生产SQL Server。

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

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

答案 3 :(得分:2)

感谢大家的帮助。我根据你们的帮助弄明白了。对于任何对这些步骤感兴趣的人,他们都是。我只想在这里列出一些额外的帮助,但上面的答案真正回答了这个问题。这假定我的问题中的设置。一旦你建立了数据库,我建议你用你的本地数据库更新它,如下所示:

  1. 在VS2013中,转到工具 - &gt; sql server object explorer - &gt; (LocalDb)\ v11.0 - &gt;数据库 - &gt; [database_name] - &gt;右键单击 - &gt;数据比较 - &gt;架构比较
  2. 在右侧下拉列表中,找到您的SQL数据库并测试连接以确保其正常工作。

  3. 点击比较 - &gt;更新目标(我不建议将其用于生产数据库,但如果它是您刚刚创建的暂存数据库,则没关系)

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

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

  6. 右键单击您的Web项目,单击发布,使用Web部署,转到数据库,定位新数据库,确保选中执行代码优先迁移(这将运行所有迁移你已经为你的新数据库上的localdb做了什么)。你实际上不必这样做。您可以选择不加控制,并在接受的答案中执行Sampath所建议的操作。

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

  8. 要管理您的数据库,请按照上面的答案操作。或者,再次使用发布向导,确保选中执行代码优先迁移并发布!