6

我是 EF 代码的新手。我在生产中有一个现有的数据库,我首先使用了 EF 4.3.1 代码,一切正常。现在我刚刚更新了我的数据库模式并得到了异常

System.InvalidOperationException: The model backing the 'MyDbContext' context has changed since the database was created. Consider using Code First Migrations to update the database (http://go.microsoft.com/fwlink/?LinkId=238269).

我不能使用DropCreateDatabaseIfModelChanges,因为它在生产中,应对架构更改的最简单方法是什么?

谢谢你。

4

6 回答 6

6

由于 EF-CF 迁移是一个相当新的概念,我建议采用一个久经考验的过程并对其进行修改以使用我们的新工具,如 EF。这是我们所做的:

  1. 用于DropCreateDatabaseIfModelChanges本地开发。这将允许您保持本地开发副本与您的模型(在代码中)同步。每次构建/运行时,您都会获得更新的本地数据库。您还可以使用 Initializer 来加载测试数据等。Database.SetInitializer<DBContextNameHere>(new DBContextInitializerNameHere());

  2. 使用 RedGate 的 SQLCompare 工具将本地开发与生产进行比较,并自动生成用于部署的更改脚本。(注意:您也可以从该工具自动部署)

http://www.red-gate.com/products/sql-development/sql-compare/index-b

主要好处是您不必更改本地开发流程,并且您可以通过生成的脚本获得可重复的版本化部署。您还可以将其与他们的 SQL 源代码控制工具结合使用,以将所有 SQL 对象和部署脚本(甚至数据)保留在源代码控制中。

不,我不为这些人工作,我只是喜欢他们的工具以及它如何帮助我解决同样的问题。

于 2012-06-12T17:13:29.213 回答
4

您可以查看使用 Entity Framework 迁移来自动更新数据库以匹配您的新模型。

http://blogs.msdn.com/b/adonet/archive/2012/02/09/ef-4-3-code-based-migrations-walkthrough.aspx

于 2012-06-11T14:22:08.753 回答
3

我发现运行以下脚本

truncate table __MigrationHistory

当您的代码/数据库不同步时,在数据库上删除此问题。

也许我只是习惯了老派,构建和修改数据库设计,相应地修改代码,或者在编码等时发现我需要一个新领域......只需在两个地方添加。

我承认我是新的(ish),MVC但有时这些功能是无用的,因为它们隐藏了事情在基本层面上的工作方式。当您了解所有内容如何组合在一起时,拥有生成器和工具来帮助一切都很好,但是当您开始时……我认为这并不好。

我遇到过许多不理解简单概念的开发人员,因为他们使用代码生成器、向导等。当涉及到真正的编程或维护遗留系统时,他们有点迷失了。

于 2013-12-04T22:29:19.733 回答
0

发生这种情况时,我通常会运行迁移以指向一个新数据库,一旦创建了该数据库,然后将新数据库的结构与现有数据库的结构进行比较,如果需要手动进行更改(否则它可能会给你一个指示是什么导致了错误 - 意外的架构更改或索引等)然后删除原始数据库上的 __MigrationHistory 表中的条目并从新数据库复制条目,以便 __MigrationHistory 变得正确并且 Code First 现在将正确同步。

于 2013-12-05T14:56:01.063 回答
0

我通过添加解决了这个问题

Database.SetInitializer<MyContext>(null); to Application_Start() inside Global.asax.cs
于 2014-02-05T09:15:00.523 回答
-1

我希望这段代码对你有帮助

EF-代码优先迁移

于 2013-11-12T05:09:37.103 回答