Entity Framework和不同环境(开发/生产)

7

我最近开始使用ASP.NET MVC进行新项目开发,但对于这项技术并不很熟悉。我还处于非常早期的阶段,正准备自学如何使用Entity Framework处理我的数据访问代码。目前我只是在努力理解各种软件/工具/特性能做些什么,但我认为我在使用EF方面走上了正确的道路。

我正在寻找一种能够看到本地数据库和生产数据库之间差异(模式而非实际数据)并将其发布到我们本地网络中的SQL Server的工具或方法。在我看来,这类似于用于数据库的分布式版本控制系统(DVCS)。

传统上(像大多数人一样),我会在代码或存储过程中使用SQL编写自己的数据访问代码,并自己处理数据库方面的事务。然而,现在对我来说,这已经不再是可选项,因为我需要为开发和生产设置单独的环境,而我也没有足够的时间或愿望手动编写所有这些代码。Dev将位于Dev机器上,而Production将托管在我们本地网络上的服务器上。

我最近开始使用Visual Studio中的“发布”功能,并成功地将其设置为相当好的工作方式,将新版本发布到我的IIS服务器所查看的目录中以提供网站。

我使用Git和Sourcetree处理我的项目代码的DVCS,但我从未亲自使用过或找到过针对数据库类似的解决方案。起初,我认为我在寻找某种针对SQL Server的DVCS,但这并没有给我带来很大的收获。本质上,我只是想找一个工具,能够管理本地和生产数据库之间的版本差异,我认为这是Entity Framework能为我完成的。

对于数据库,我正在使用SQL Server。我还没有为此项目设置数据库,所以我认为采用Code First的EF是最好的方法。我想确保EF使用的是SQL Server中的数据库,我可以通过指定连接字符串来设置,而不是使用Visual Studio中的连接字符串。偶尔我需要通过SSMS进行数据库访问,以便进行索引和备份等操作,但我仍然希望EF承担大部分工作。

  1. 我能否通过我希望的方式使用Entity Framework实现我的目标?也就是说,是否有一种工具可以处理版本之间的数据库差异和更新?我不想弄清楚我在本地更改了哪些表/列等,并将其应用到生产数据库中,但我也不希望生产数据库中的数据发生变化,只想改变结构......
  2. 我希望任何人都能提供关于如何构建此设置的建议,甚至链接到设置教程。我相信我不是第一个想做这件事的人,也知道我不会是最后一个。
基本上,我只想点击“发布”按钮,然后将代码和数据库中的所有本地差异发布到生产服务器。

1
看一下迁移。https://msdn.microsoft.com/zh-cn/data/jj591621.aspx#script - jvanrhyn
2个回答

6
“我是否能够使用Entity Framework达到我期望的目标?” 这可以很容易地通过Entity Framework实现。您正在寻找的是“EF Migrations”。EF Migrations会扫描您的POCO类,以查看它们是否与数据库匹配。如果有新的或更改的内容,它将为您更新数据库表。要了解如何使用EF Migrations,请查看此链接 https://msdn.microsoft.com/en-us/data/jj591621.aspx 连接字符串可以通过Web.Config/App.Config转换进行解决。Web.Config转换在发布期间自动替换开发连接字符串为生产连接字符串。要了解如何使用web.config转换,请查看此链接 http://www.asp.net/mvc/overview/deployment/visual-studio-web-deployment/web-config-transformations 在发布期间,您可以告诉VisualStudio检查哪些迁移尚未应用于生产数据库,并自动应用这些迁移。本文http://www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc/migrations-and-deployment-with-the-entity-framework-in-an-asp-net-mvc-application介绍了如何在发布到Windows Azure时应用迁移。
希望对您有所帮助!

这正是我在寻找的答案,并且还附有教程的支持参考!非常感谢! - Sean Missingham

2
在实体框架中,如果你正在使用一个已有的数据库,你可以在运行时设置连接字符串。
DbContext 构造函数允许你通过名称(在应用程序的 app.config 或 web.config 文件中)或完整的 SQL 连接字符串来包含连接字符串,但需要添加额外的元数据部分。
例如,如果你定义了一个 DbContext:
public YourModelContainer() : base("name=YourModelContainer")
{
}

请注意,调用base("name=...")可以允许您在配置文件中指定命名的实体框架连接字符串。

要在运行时构建一个连接字符串,您需要创建一个带有重载构造函数:

public YourModelContainer(string connectionString) : base(connectionString)
{
  // where connection string includes the metadata section
  // metadata=res://*/Models.YourModel.csdl|res://*/Models.YourModel.ssdl|res://*/Models.YourModel.msl;provider=System.Data.SqlClient;provider connection string="data source=.;initial catalog=YourDatabase;user id=dev;password=p455w0rd;MultipleActiveResultSets=True;App=EntityFramework"
  // This is just a concatenation of the metadata with a SQL connection string, you can use the EntityConnectionStringBuilder class if you're building this manually at runtime
}

请查看https://dev59.com/-4Dba4cB1Zd3GeqPIsm_#26043339

我之前遇到过类似的问题,但这个解释很好。谢谢! - Sean Missingham

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