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

时间:2016-01-05 05:58:38

标签: c# sql-server asp.net-mvc database entity-framework

我最近使用ASP.NET MVC开展了一个新项目,我对这项技术并不十分熟悉。我还处于早期阶段,我即将开始自学如何使用Entity Framework来处理我的数据访问代码。我只是在艰难的时间制作软件/工具/功能可以做什么的头或尾,但我认为我在EF的正确轨道上。

我正在寻找能够看到我的本地数据库与我的生产数据库中的差异(架构,而不是其中的实际数据)并能够将其发布到SQL Server的内容。我们的本地网络。在我看来,我认为它就像数据库的DVCS。

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

我最近开始在Visual Studio中使用“发布”功能,并且我已设法将其设置为工作得很好,将新版本发布到我的IIS服务器正在查看的目录中以提供该站点。

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

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

  1. 我可以按照我希望的方式使用Entity Framework实现我想要的目标吗?也就是说,有一个工具来处理数据库差异和版本之间的更新? 我不想弄清楚我在本地更改了哪些表/列等,并且必须以某种方式将其工作到生产数据库中,但我也不希望生产数据库中的数据发生变化,只是结构...
  2. 我很乐意为任何人提供有关如何构建此设置的建议,甚至是指向如何设置它的教程的链接。我确定我不是第一个想要这样做的人,我知道我不会是最后一个。
  3. 基本上我只想点击“发布”按钮,将代码和数据库中的所有本地差异发布到生产服务器。

2 个答案:

答案 0 :(得分:4)

  

我能否按照我的方式使用Entity Framework实现我想要的目标   希望?

这可以通过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时如何应用迁移。

希望它有所帮助!

答案 1 :(得分: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://stackoverflow.com/a/26043339/474702

相关问题