Sql Azure CompatibleWithModel 不起作用

Posted

技术标签:

【中文标题】Sql Azure CompatibleWithModel 不起作用【英文标题】:Sql Azure CompatibleWithModel not working 【发布时间】:2012-05-30 15:03:16 【问题描述】:

在我的代码中,我尝试使用“mycontext.Database.CompatibleWithModel(true)”检查我的实体框架 Code First 模型和 Sql Azure 数据库是否同步。但是,当出现不兼容时,这条线会出现以下异常。

“支持 'MyContext' 上下文的模型自数据库创建以来已更改。手动删除/更新数据库,或使用 IDatabaseInitializer 实例调用 Database.SetInitializer。例如,DropCreateDatabaseIfModelChanges 策略将自动删除并重新创建数据库,并可选择用新数据为其播种。”

这似乎违背了检查的目的,因为检查本身由于不兼容而倒塌。

出于各种原因,我不想使用 Database.SetInitializer 方法。

有什么建议吗?

这是一个特定的 Sql Azure 问题吗?

谢谢 马丁

【问题讨论】:

你的 MVC 和 EF 版本是多少?取决于不同的版本,有不同的方法来处理此类问题。另外,如果您不想使用 Database.SetInitializer,您仍然可以使用 Database.SetInitializer(null);在 Global.asax 的 Application_Start() 中 我正在使用 MVC3 和 EF v4。 @AvkashChauhan 【参考方案1】:

请查看下方的 ScottGu 博客:

http://weblogs.asp.net/scottgu/archive/2010/08/03/using-ef-code-first-with-an-existing-database.aspx

这是发生了什么以及如何处理它:

第一次创建模型时,我们会运行 DatabaseInitializer 来执行诸如创建数据库(如果数据库不存在)或添加种子数据等操作。默认的 DatabaseInitializer 尝试将使用模型所需的数据库架构与存储在使用数据库创建的 EdmMetadata 表中的架构哈希进行比较(当 Code First 是创建数据库的人时)。现有的数据库不会有 EdmMetadata 表,因此不会有哈希......如果该表丢失,今天的实现将抛出。在我们发布最终版本之前,我们将努力改变这种行为,因为它是默认的。在此之前,现有数据库通常不需要任何数据库初始化程序,因此可以通过调用以下方法为您的上下文类型关闭它:

Database.SetInitializer<Production>(null);

使用上面的代码,您并没有重新创建数据库,而是使用现有的数据库,所以我认为使用 Database.SetInitializer 是一个问题,除非您对使用它有一些认真的想法。

更多信息:Entity Framework Code Only error: the model backing the context has changed since the database was created

【讨论】:

以上是关于Sql Azure CompatibleWithModel 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Azure SQL Database (22) Azure SQL Database支持中文值

普通与云/Azure 托管以及 SQL Azure 与 SQL Server 的作用

是否可以从 Azure SQL DB 连接 Azure SQL 托管实例?

Azure SQL DB 与 Azure 搜索的自动索引/同步如何工作?

从 SQL 向 Azure 服务总线队列添加消息

[Azure]Azure SQL Database 资料库定序