令我惊讶的是,使用CreateDatabaseIfNotExists上下文初始化程序,该行
context.Database.Initialize(true)
如果架构与我的代码优先架构不匹配,则不会引发异常。
有没有办法验证当前数据库是否与我们的模式匹配,例如,我们尝试访问一个实体,其表不再存在于数据库中,并且 EF 抛出异常?
令我惊讶的是,使用CreateDatabaseIfNotExists上下文初始化程序,该行
context.Database.Initialize(true)
如果架构与我的代码优先架构不匹配,则不会引发异常。
有没有办法验证当前数据库是否与我们的模式匹配,例如,我们尝试访问一个实体,其表不再存在于数据库中,并且 EF 抛出异常?
您可以调用 CompatibleWithModel 来确定数据库是否与模型匹配。如果将参数设置为 true,如果在数据库中找不到模型数据,则会引发异常。
bool isCompatible = context.Database.CompatibleWithModel(true);
每次启动应用程序时,EF 都不会交叉检查数据库架构和模型。相反,它正在寻找保存到数据库(__MigrationsHistory 表和 EdmMetadata 之前)的模型,并将这个保存的模型与您正在使用的模型进行比较。如果模型匹配,则将使用数据库。如果模型不匹配,则会抛出异常。如果您的数据库中既没有 __MigrationHistory 也没有 EdmMetadata 表,EF 将假定您使用 DbContext 的数据库优先方法,并且您的数据库与模型匹配。如果您想将数据库与您的模型进行比较,您可以为您的模型转储 Edmx(使用 EdmxWriter.WriteEdmx)并使用 Visual Studio 和 EF 设计器从数据库中获取 Edmx 并比较 SSDL 部分。
有两种工具可以做到这一点。第一个很受欢迎并且高度发达:
开发者的解释:https ://www.thereformedprogrammer.net/ef-core-taking-full-control-of-the-database-schema/
正如您将看到的,开发人员自己的解释包括对 Code-First、Database-First 和 SQL-First 方法的全面概述。他讨论了所有方法的优缺点。并说明为什么架构比较工具对于使用 SQL-First 方法是必要的。
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/