解决Code First因_migrationHistory表与代码不一致的问题

  咱们在测试环境多人开发时,因为会存在多个测试、开发环境,可是你们共用一个数据库。数据库

  这时候会碰到一个问题,一旦有某我的经过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);
相关文章
相关标签/搜索