令我惊讶的是,使用 CreateDatabaseIfNotExists 上下文初始化程序,行
context.Database.Initialize(true)
如果架构与我的代码第一个架构不匹配,不会抛出异常。
有没有办法验证当前数据库是否与我们的模式匹配,例如,我们尝试访问一个实体,其表不再存在于数据库中,并且EF抛出异常?
答案 0 :(得分:17)
您可以调用CompatibleWithModel来确定数据库是否与模型匹配。如果将参数设置为true,则在数据库中找不到模型数据时将抛出异常。
bool isCompatible = context.Database.CompatibleWithModel(true);
答案 1 :(得分:7)
每次启动应用程序时,EF都不会与模型交叉检查数据库架构。相反,它正在寻找保存到数据库的模型(__MigrationsHistory表和EdmMetadata之前),并将此保存的模型与您正在使用的模型进行比较。如果模型匹配,则将使用数据库。如果模型不匹配,则抛出异常。如果数据库中既没有__MigrationHistory也没有EdmMetadata表,EF将假定您正在使用DbContext的数据库优先方法,并且您的数据库与模型匹配。如果要将数据库与模型进行比较,可以为模型转储Edmx(使用EdmxWriter.WriteEdmx)并使用Visual Studio和EF设计器从数据库获取Edmx并比较SSDL部分。
答案 2 :(得分:1)
有两种工具可以做到这一点。第一个是受欢迎且高度发达的:
开发者的解释:https://www.thereformedprogrammer.net/ef-core-taking-full-control-of-the-database-schema/
您将看到,开发人员自己的解释包括对Code-First,Database-First和SQL-First方法的全面概述。他讨论了所有方法的利弊。并说明了为什么使用SQL-First方法需要使用Schema Compare工具。
github项目:https://github.com/JonPSmith/EfCore.TestSupport/wiki/9.-EfSchemaCompare
上面另一个评论者提到的一个鲜为人知的第二个: https://github.com/reckface/EntityFramework.Verify
第二个开发人员还建议使用DbUp,该文章提供了一篇哲学文章,我认为值得一读,以了解“ Microsofty”代码优先和db-first方法为何存在问题,以及为什么将数据库查看为状态的想法系统可以说是一个糟糕的选择。 https://dbup.readthedocs.io/en/latest/philosophy-behind-dbup/