首先使用的EF版本是6.0,请看项目的结构:
在这个解决方案中,Core和Web两个项目分别有一个DbContext,我配置的是这两个DbContext指向 同一个数据库。同时两个项目我都分别开启了Migration,如图:
当我修改了Core中的实体类,用Migration命令执行完迁移的时候,在单元测试中(Test项目)调用Core中的DbContext执行数据库操作不报错。
但是在运行Web项目时,调用Core中的 DbContext进行数据库操作就会报错,说是模型已经变更:
异常的详细信息:
在 System.Data.Entity.CreateDatabaseIfNotExists`1.<>c__DisplayClass1.<InitializeDatabase>b__0() 在 System.Data.Entity.Internal.MigrationsChecker.IsMigrationsConfigured(InternalContext internalContext, Func`1 databaseExists) 在 System.Data.Entity.CreateDatabaseIfNotExists`1.InitializeDatabase(TContext context) 在 System.Data.Entity.Internal.InternalContext.<>c__DisplayClasse`1.<CreateInitializationAction>b__d() 在 System.Data.Entity.Internal.InternalContext.PerformInitializationAction(Action action) 在 System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization() 在 System.Data.Entity.Internal.LazyInternalContext.<InitializeDatabase>b__4(InternalContext c) 在 System.Data.Entity.Internal.RetryAction`1.PerformAction(TInput input) 在 System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(Action`1 action) 在 System.Data.Entity.Internal.LazyInternalContext.InitializeDatabase() 在 System.Data.Entity.Internal.InternalContext.Initialize() 在 System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType) 在 System.Data.Entity.Internal.Linq.InternalSet`1.Initialize() 在 System.Data.Entity.Internal.Linq.InternalSet`1.get_InternalContext() 在 System.Data.Entity.Infrastructure.DbQuery`1.System.Linq.IQueryable.get_Provider() 在 System.Linq.Queryable.Where[TSource](IQueryable`1 source, Expression`1 predicate) 在 BI_DIM_MS.Core.BLL.DimTableInfoBLL.GetAllDimTableInfoPage(Int32 iDisplayStart, Int32 iDisplayLength) 位置 F:\WorkZone\WorkProjects\BI\SVN\Ongoing source code\BI_DIM_MS\BI_DIM_MS.Core\BLL\DimTableInfoBLL.cs:行号 59
初用EF,怀疑是两个DbContext冲突了,还请高手指点,谢谢。
为何要两个 DbContext,实体更新,那两个DbContext都要 update-database
不用两个都update的,从6.0开始可以让两个DbContext连接同一个数据库了。结果多番实验,终于找到了问题,是一个很愚蠢的错误。Web中的EF版本是6.0.0而Core中的版本是6.1.3,所以才出的错。
谢谢啦
谢谢兄台的回答