首页 > 其他 > 详细

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

时间:2018-06-22 19:16:52      阅读:337      评论:0      收藏:0      [点我收藏+]

  我们在测试环境多人开发时,由于会存在多个测试、开发环境,但是大家共用一个数据库。

  这时候会碰到一个问题,一旦有某个人通过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);

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

原文:https://www.cnblogs.com/ceci/p/9215123.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!