如何检查数据库模式是否与Entity Framework模式匹配?

问题描述 投票:12回答:3

令我惊讶的是,使用 CreateDatabaseIfNotExists 上下文初始化器,这一行

context.Database.Initialize(true)

如果模式不匹配我的代码第一个模式,就抛出异常。

有没有办法在验证当前数据库是否匹配我们的模式之前,比如我们尝试访问一个实体,其表在数据库上已经不存在了,EF就会抛出一个异常?

entity-framework ef-code-first database-schema initializer
3个回答
17
投票

你可以调用CompatibleWithModel来确定数据库是否匹配模型。如果你把参数设置为true,如果在数据库中没有找到模型数据,它将抛出一个异常。

bool isCompatible = context.Database.CompatibleWithModel(true);

8
投票

每次启动应用程序时,EF不会交叉检查数据库模式和模型。相反,它正在寻找保存到数据库中的模型(__MigrationsHistory表和EdmMetadata之前),并将这个保存的模型与您正在使用的模型进行比较。如果模型匹配,那么将使用数据库。如果模型不匹配,将抛出一个异常。如果你的数据库中既没有__MigrationHistory表,也没有EdmMetadata表,EF将假设你使用DbContext的数据库优先方法,并且你的数据库与模型匹配。如果你想比较数据库和模型,你可以转储模型的Edmx(使用EdmxWriter.WriteEdmx),然后使用Visual Studio和EF设计器从数据库中获取Edmx并比较SSDL部分。


0
投票

有两个工具可以做到这一点。第一种是流行的,而且开发程度很高。

开发者的解释。https:/www.thereformedprogrammer.netef-core-taking-full-control-of-the-database-schema

正如你所看到的,开发者自己的解释包括了对Code-First、Database-First和SQL-First方法的全面概述。他讨论了所有方法的优点和缺点。并展示了为什么使用SQL-First方法需要Schema Compare工具。

github项目。https:/github.comJonPSmithEfCore.TestSupportwiki9.-EfSchemaCompare:

而上面另一位评论者提到的还有一个鲜为人知的第二种。https:/github.comreckfaceEntityFramework.Verify。

第二位开发者还推荐了DbUp,它提供了一篇哲学文章,我认为这是一篇值得阅读的文章,为什么 "微软式 "的代码优先和db优先的方法是有问题的,为什么把数据库变化看作是一个状态系统的想法可以说是一个糟糕的选择。https:/dbup.readthedocs.ioenlatestphilosaticophy-behind-dbup

© www.soinside.com 2019 - 2024. All rights reserved.