c# - EF Core 中是否存在等效于 Database.CompatibleWithModel(bool)

标签 c# entity-framework ef-code-first entity-framework-core

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

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

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

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

最佳答案

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

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!");
    }
}

关于c# - EF Core 中是否存在等效于 Database.CompatibleWithModel(bool),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49240689/

相关文章:

c# - 如何检查ffmpeg何时完成任务?

c# - EF 6.X 中的 Entity Framework Code First Fluent API 默认值

mysql - 使用 Take() 到 Mysql 的 Linq 查询不会对实际查询添加限制

c# - EntityFramework Core 2.0 跳过加载专栏

linq-to-sql - Entity Framework 4 的 SqlMetal 替代方案

使用 Entity Framework Code First 的 C# 模型用户、好友请求和好友

asp.net-mvc - Entity Framework Code First 数据库文件未在 APP_DATA 中创建,但查询有效

c# - 如何对可观察集合进行排序?

C# linq groupby 返回不正确的组

c# - 在 VS 开发服务器和 IIS 上为 ASP.NET MVC 应用程序设置文化