C# EF Core中是否存在与Database.CompatibleWithModel(bool)等效的文件
我正在从事一个使用EFCore 2.1.0-preview1-final代码优先方法的项目。与EF6(和以前的版本)一样,我希望确保DbContext(和模型)与数据库的兼容性 在EF6中,默认情况下它是启用的,并且可以使用禁用它。据我所知,EF使用存储模型信息的C# EF Core中是否存在与Database.CompatibleWithModel(bool)等效的文件,c#,entity-framework,ef-code-first,entity-framework-core,C#,Entity Framework,Ef Code First,Entity Framework Core,我正在从事一个使用EFCore 2.1.0-preview1-final代码优先方法的项目。与EF6(和以前的版本)一样,我希望确保DbContext(和模型)与数据库的兼容性 在EF6中,默认情况下它是启用的,并且可以使用禁用它。据我所知,EF使用存储模型信息的\uu MigrationHistory表。EFCore在\u EFMigrationsHistory表中没有可以提供此类信息的列 我在EFCore中找不到有关兼容性检查的任何信息。但是我想确保兼容性,因为在一些测试之后,它似乎在默认情
\uu MigrationHistory
表。EFCore在\u EFMigrationsHistory
表中没有可以提供此类信息的列
我在EFCore中找不到有关兼容性检查的任何信息。但是我想确保兼容性,因为在一些测试之后,它似乎在默认情况下没有启用(或者确实存在)。我通过手动添加和删除数据库中的一些列并在修改后执行应用程序来测试它。我——出乎意料——没有收到任何例外
有人知道如何实现从模型到数据库的兼容性检查,或者像EF6 for EFCore那样实现从模型到数据库的兼容性检查吗?
或者可以提供一些有用的链接,以获取关于它的进一步信息,或者为什么它不存在于EFCore中(因为它不是必需的)?I强烈建议不要这样做,因为它使用内部组件并且容易出错,但这里有一种方法
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!");
}
}
使用(var db=new MyDbContext())
{
var reporter=newoperationreporter(处理程序:null);
var designTimeServiceCollection=new ServiceCollection()
AddSingleton先生(记者)
.记者;
新建SqlServerDesignTimeServices()。配置DesignTimeServices(designTimeServiceCollection);
var designTimeServices=designTimeServiceCollection.BuildServiceProvider();
var databaseModelFactory=designTimeServices.GetService();
var databaseModel=(Model)databaseModelFactory.Create(
db.Database.GetDbConnection().ConnectionString,
表:新字符串[0],
架构:新字符串[0],
useDatabaseNames:false);
var currentModel=db.Model;
//修复数据库模型。它从未打算像这样使用。;-)
foreach(databaseModel.GetEntityTypes()中的变量entityType)
{
if(entityType.Relational().Schema==databaseModel.Relational().DefaultSchema)
{
entityType.Relational().Schema=null;
}
}
databaseModel.Relational().DefaultSchema=null;
databaseModel.SqlServer().ValueGenerationStrategy=
currentModel.SqlServer().ValueGenerationStrategy;
//TODO:…根据需要进行更多修复
var different=db.GetService();
if(difference.HasDifferences(databaseModel,currentModel))
{
抛出新异常(“数据库和模型不同步!”);
}
}
EF6没有做那么多。它只是确保自上次EF更改数据库模式以来,模型没有更改。它不会检测到在EF之外进行的模式更改。嗯,好的。我不知道我如何能做完全相同的EF核心。也许我必须检查一下EF中的实现。非常感谢。好吧,我不会用它,因为你反对它。我只是想知道这怎么可能。你有没有一些链接,我可以从中了解到为什么EFCore不支持这种开箱即用的功能?没有文档。我们看到两种开发选项:1)您的域模型是真相的来源,您使用迁移来管理数据库模式。2) 您的数据库模式是真相的来源,您使用数据库()中的反向工程/更新模型来保持域模型的同步。没有一个单一的真相来源会变得太混乱,需要像CompatibleWithModel这样的工具来帮助保持一切同步。描述了你可以做的其他同步检查。好的,我完全同意你的看法。只有以下场景的注释:另一个开发人员或管理员删除数据库中的整数列。此时,数据库仅用于读取数据-不插入新数据。由于架构修改,您将不会收到异常。因此,您始终具有默认的int值0。如果使用EF6,兼容性检查将在创建第一个DbContext对象时引发异常。(每个基本数据类型的行为都是一样的)在过去,我已经有过这样的问题。谢谢。:)