EF Core 中是否存在等同于 Database.CompatibleWithModel(bool) 的项

Does an equivalent to Database.CompatibleWithModel(bool) exist in EF Core

我正在开发一个使用 EFCore 2.1.0-preview1-final 代码优先方法的项目。就像在 EF6(和以前的版本)中一样,我想确保我的 DbContext(和模型)与数据库的兼容性。

在 EF6 中,它默认启用,可以使用 Database.CompatibleWithModel(false); 停用它。据我所知,EF 使用存储模型信息的 __MigrationHistory table 。 EFCore 在 __EFMigrationsHistory table 中没有可以提供此类信息的此类列。

我找不到任何关于 EFCore 兼容性检查的信息。但是我想确保兼容性,因为经过一些测试它似乎不是默认启用的(或者确实存在)。我通过手动添加和删除数据库中的一些列并在修改后执行应用程序来测试它。我 - 出乎我的意料 - 没有例外。

有谁知道如何实现从模型到数据库的兼容性检查,反之亦然,就像在 EF6 for EFCore 中一样? 或者可以提供一些有用的链接以获取有关它的更多信息或为什么它在 EFCore 中不存在(因为没有必要)?

强烈建议不要这样做,因为它使用内部组件并且是error-prone,但这是一种方法它。

using (var db = new MyDbContext())
{
    var reporter = new OperationReporter(handler: null);
    var designTimeServiceCollection = new ServiceCollection()
        .AddSingleton<IOperationReporter>(reporter)
        .AddScaffolding(reporter);
    new SqlServerDesignTimeServices().ConfigureDesignTimeServices(designTimeServiceCollection);

    var designTimeServices = designTimeServiceCollection.BuildServiceProvider();

    var databaseModelFactory = designTimeServices.GetService<IScaffoldingModelFactory>();
    var databaseModel = (Model)databaseModelFactory.Create(
        db.Database.GetDbConnection().ConnectionString,
        tables: new string[0],
        schemas: new string[0],
        useDatabaseNames: false);

    var currentModel = db.Model;

    // Fix up the database model. It was never intended to be used like this. ;-)
    foreach (var entityType in databaseModel.GetEntityTypes())
    {
        if (entityType.Relational().Schema == databaseModel.Relational().DefaultSchema)
        {
            entityType.Relational().Schema = null;
        }
    }
    databaseModel.Relational().DefaultSchema = null;
    databaseModel.SqlServer().ValueGenerationStrategy =
        currentModel.SqlServer().ValueGenerationStrategy;
    // TODO: ...more fix up as needed

    var differ = db.GetService<IMigrationsModelDiffer>();

    if (differ.HasDifferences(databaseModel, currentModel))
    {
        throw new Exception("The database and model are out-of-sync!");
    }
}