解决Code First因_migrationHistory表与代码不一致的问题
我们在测试环境多人开发时,由于会存在多个测试、开发环境,但是大家共用一个数据库。
这时候会碰到一个问题,一旦有某个人通过Migration更新了数据库,其他环境在首次查询数据库的时候都会收到Dbcontext与代码不一致的错误,提示需要做Migration的错误。但是其他人的代码很可能都没有签入到服务器,所以根本无法获得Migration的记录。遇到这种情况需要关闭Codefirst对数据库的检测代码中增加:
Database.SetInitializer<testContext>(null);
更多内容:
Code first数据库初始化的4种策略,其中第四种就不会检查_migrationHistory的记录
策略一:数据库不存在时重新创建数据库
Database.SetInitializer<testContext>(new CreateDatabaseIfNotExists<testContext>());
策略二:每次启动应用程序时创建数据库
Database.SetInitializer<testContext>(new DropCreateDatabaseAlways<testContext>());
策略三:模型更改时重新创建数据库
Database.SetInitializer<testContext>(new DropCreateDatabaseIfModelChanges<testContext>());
策略四:从不创建数据库
Database.SetInitializer<testContext>(null);
Entity Framework数据库初始化示例
using System.Data.Entity; using System.Data.Entity.Infrastructure; using Web.Models.Mapping; namespace Web.Models { public class testContext : DbContext { static testContext() { Database.SetInitializer<testContext>(null); } public testContext() : base("Name=testContext") { } public DbSet<Person> People { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Configurations.Add(new PersonMap()); } } }
Entity Framework中DbContext首次加载OnModelCreating会检查__MigrationHistory表,作为使用Code Frist编程模式,而实际先有数据库时,这种检测就是多余的了,所以需要屏蔽,在EF 4.1之前可以使用在OnModelCreating函数总加入下面语句来屏蔽这种检测:
modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
而到4.3之后需要使用,上列语句以被MSDN明确表示过时,所以需要新的方式取代:
Database.SetInitializer<DBContext>(null);