我正在开发一个使用 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/