C#学习教程:DropCreateDatabaseIfModelChangesEF6导致System.InvalidOperationException:支持上下文的模型发生了改变在构建服务器上。我正在使用DropCreateDatabaseIfModelChanges初始值设定项。当我将其更改为MigrateDatabaseToLatestVersion时,一切正常,但我想坚持使用之前的初始化程序。我得到的错误是:System.InvalidOperationException:System.InvalidOperationException:自数据库创建以来,支持“AppContext”上下文的模型已更改。考虑使用代码优先迁移来更新数据库(http://go.microsoft.com/fwlink/?LinkId=238269)。这是正确的,它已经改变了,但是当使用DropCreateDatabaseIfModelChanges初始值设定项时,应该重新创建它。有任何想法吗?EF在App.config中配置。这是相关部分:好吧,看起来EF6.0引入了一条新规则:“如果DbContext使用初始化程序并且配置了迁移,则在构建模型时抛出异常”。直到并包括EF6RC,这都没有强制执行。烦人的部分是“配置迁移”是由DbMigrationsConfiguration的实现定义的。似乎没有办法在测试中以编程方式禁用迁移——如果你已经实现了,我以与SebastianPiu类似的方式解决了这个问题——我不得不从我的测试中删除Configuration类,但我不能,因为我们是为我们的主要项目使用迁移。哎呀!这是我以前的代码:publicclassMyDbContext:DbDContext,IMyDbContext{publicIDbSetUsers{get;设置;}公共IDbSet小部件{get;set;}}//迁移被认为是为MyDbContext配置的,因为存在此类实现。内部密封类配置:DbMigrationsConfiguration{publicConfiguration(){AutomaticMigrationsEnabled=false;}}//声明(和其他地方注册)这个MyDbContext类型的数据库初始值设定项-但该类型的DbMigrationsConfiguration已经存在。publicclassTestDatabaseInitializer:DropCreateDatabaseAlways{protectedoverridevoidSeed(MyDbContextcontext){}}我在测试代码中初始化DbContext时遇到了System.InvalidOperationException。由于该应用程序不使用任何初始化程序,因此可以像以前一样运行该应用程序。这只会破坏我的考试。解决方案(感觉更像是缺少EF的解决方法)是将Initializer和DbMigrationsConfiguration分段,以便在运行时环境中只看到一个。我希望我的测试使用初始值设定项,我希望我的应用程序使用DbMigrationsConfiguration。如果DbContext有一个接口,这可以更干净地完成,但它只实现IObjectContextAdapter。首先,我将我的DbContext抽象为:publicabstractclassMyDbContextBase:DbContext,IMyDbContext{publicIDbSetUsers{get;设置;}公共IDbSet小部件{get;设置;}}然后我分叉了2个类:publicclassMyDbContext:MyDbContextBase{publicMyDbContext(stringconnectionStringOrName,IDatabaseInitializerdbInitializer):base(connectionStringOrName){}}publicclassMyTestDbContext:MyDbContextBase{publicMyTestDbContext(stringconnectionStringOrName,IDatabaseInitializerdbInitializer):base(connectionStringOrName){Database.SetInitializer(dbInitializer);}}MyDbContext和MyTestDbContext都是IMyDbContext,因此您现有的依赖注入设置应该无需更改即可工作。我只测试了Spring.NET。我的DbMigrationsConfiguration实现了测试不使用的派生类型:internalsealedclassConfiguration:DbMigrationsConfiguration{publicConfiguration(){AutomaticMigrationsEnabled=false;最后,初始化器的类型被移动到派生测试类类型:publicclassTestDatabaseInitializer:DropCreateDatabaseAlways{protectedoverridevoidSeed(MyTestDbContextcontext){}}仍然像以前一样工作。升级到EF6后,我发现了同样的问题。在阅读了Stefan的评论并出现与他描述的相同的症状(测试从我的主项目加载Configuration类)之后,我的解决方案/解决方法是我可以这样做,因为我的大部分测试只是从PersistenceTest类扩展而来,所以我明白如果你有一个大目录,这可能是一个艰难的改变。所以期待其他解决方案这是因为您启用了迁移并且正在使用DropCreateDatabaseIfModelChanges初始值设定项。Entityframework不支持将此初始化程序用于迁移。您有两个选择:要么看起来该行为是故意的。这是来自一位开发人员的引述:此行为更改是设计使然,因为EF5将在不使用定义的迁移的情况下创建数据库,这意味着初始化程序创建的数据库可能与迁移创建的数据库不同。这可能导致针对一个数据库模式进行测试,但在生产中针对不同的数据库模式运行。但是,目前我们决定更改此行为并在此处跟踪它:https://entityframework.codeplex.com/workitem/1709对我来说效果很好的是使用define来排除迁移。方法如下:#if!TESTinternalsealedclassConfiguration:DbMigrationsConfiguration{//...}#endif您可能需要排除所有迁移,这也不完全令人满意(但我还没有尝试过,因为我不还没有任何迁移)。以上是C#学习教程:DropCreateDatabaseIfModelChangesEF6causesSystem.InvalidOperationException:Themodelthatsupportscontexthaschangedallthecontentshared.如果对大家有用,需要进一步了解C#学习教程,希望大家多加关注——本文来自网络收集,不代表立场,如涉及侵权,请点击右转联系管理员删除。如需转载请注明出处:
