实体框架和不同的环境(开发/生产)

本文关键字:开发 生产 环境 框架 实体 | 更新日期: 2023-09-27 18:28:56

我最近使用ASP.NET MVC进行了一个新项目,但我对该技术并不太熟悉。我还处于早期阶段,即将开始自学如何使用实体框架来处理我的数据访问代码。我只是很难弄清楚什么软件/工具/功能可以做什么,但我认为我在EF方面走在了正确的道路上。

我正在寻找能够看到我的本地数据库与生产数据库(模式,而不是其中的实际数据)中的差异的东西,并能够将其发布到我们本地网络中的SQL Server。在我看来,我把它看作是数据库的DVCS。

传统上(就像我说的大多数人一样),我会在代码或存储过程等中使用SQL编写自己的数据访问代码,我会自己处理数据库方面的事情。不过,这对我来说不再是一种选择,因为我需要为开发和生产设置单独的环境,而且我真的没有时间也不想再手动编写所有这些代码了。开发人员将在开发机器的本地,生产将托管在我们本地网络上的服务器上。

我最近开始在Visual Studio中使用"发布"功能,并成功地将其设置为运行良好,将新版本发布到IIS服务器正在查找的目录中以提供网站。

我使用Git和Sourcetree来处理我项目代码的DVCS,但我从未亲自使用或找到过类似的数据库解决方案。一开始我以为我在为SQL Server寻找某种DVCS,但没有得到太多回报。从本质上讲,我只想要某种工具来管理本地数据库和生产数据库之间的版本差异,我认为这是EF可以为我做的事情。

对于数据库,我使用SQL Server。我还没有为这个项目建立数据库,所以我认为代码优先EF将是最好的方法。不过,我想确保EF在SQL Server中使用数据库,我相信我可以通过指定要使用的连接字符串(而不是Visual Studio中的连接字符串)来设置该数据库。我偶尔需要通过SSMS访问数据库,这样我就可以处理索引和备份计划,这是我通常通过SSMS做的,但我仍然希望EF为我做大部分工作。

  1. 我能像我希望的那样使用实体框架来实现我想要的目标吗?也就是说,有一个处理数据库差异和版本之间更新的工具吗?我不想弄清楚哪些表/列等。我在本地进行了更改,必须以某种方式将其输入到生产数据库中,但我也不希望生产数据库中的数据发生更改,只是结构
  2. 我希望任何人都能就如何构建这个设置提供建议,甚至可以链接到如何设置的教程。我确信我不是第一个想这样做的人,我知道我不会是最后一个

本质上,我只想单击"发布"按钮,并将代码和数据库中的所有本地差异发布到生产服务器。

实体框架和不同的环境(开发/生产)

我能像现在这样使用实体框架实现我想要的目标吗希望?

EntityFramework可以很容易地做到这一点。您正在寻找的是所谓的"EF迁移"。EF迁移扫描您的POCO类,看看它们是否与您的数据库匹配。如果有新的或更改的内容,它将为您更新数据库表。要了解如何使用EF迁移,请查看此链接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时如何应用迁移。

希望它能有所帮助!

在实体框架中,如果使用现有数据库,则可以在运行时设置连接字符串。

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://stackoverflow.com/a/26043339/474702