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