咱们在测试环境多人开发时,因为会存在多个测试、开发环境,可是你们共用一个数据库。数据库
这时候会碰到一个问题,一旦有某我的经过Migration更新了数据库,其余环境在首次查询数据库的时候都会收到Dbcontext与代码不一致的错误,提示须要作Migration的错误。可是其余人的代码极可能都没有签入到服务器,因此根本没法得到Migration的记录。遇到这种状况须要关闭Codefirst对数据库的检测代码中增长:编程
Database.SetInitializer<testContext>(null);
更多内容:服务器
Code first数据库初始化的4种策略,其中第四种就不会检查_migrationHistory的记录app
策略一:数据库不存在时从新建立数据库ide
Database.SetInitializer<testContext>(new CreateDatabaseIfNotExists<testContext>());
策略二:每次启动应用程序时建立数据库函数
Database.SetInitializer<testContext>(new DropCreateDatabaseAlways<testContext>());
策略三:模型更改时从新建立数据库测试
Database.SetInitializer<testContext>(new DropCreateDatabaseIfModelChanges<testContext>());
策略四:从不建立数据库ui
Database.SetInitializer<testContext>(null);
Entity Framework数据库初始化示例
spa
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函数总加入下面语句来屏蔽这种检测:code
modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
而到4.3以后须要使用,上列语句以被MSDN明确表示过期,因此须要新的方式取代:
Database.SetInitializer<DBContext>(null);