我正在开发一个使用 EFCore 2.1.0-preview1-final 代码第一种方法的项目。与EF6(和以前的版本)一样,我想确保我的DbContext(和模型)与数据库的兼容性。
在EF6中,它默认启用,可以使用Database.CompatibleWithModel(false);
停用它。据我所知,EF使用存储模型信息的__MigrationHistory
表。 EFCore在__EFMigrationsHistory
表中没有可以提供此类信息的列。
我在EFCore中找不到有关兼容性检查的任何信息。但我想确保兼容性,因为在某些测试之后,它似乎默认不启用(或确实存在)。我通过手动添加和删除数据库中的某些列并在修改后执行应用程序来测试它。我 - 违背我的期望 - 也没有例外。
有人知道如何从模型到数据库实现兼容性检查,反之亦然,如EF6 for EFCore? 或者可以提供一些有用的链接,以获取有关它的更多信息或为什么它不存在于EFCore中(因为没有必要)?
答案 0 :(得分:1)
我 强烈 建议不要这样做,因为它使用内部组件并且容易出错,但这是一种方法。
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!");
}
}