通过代码执行Entity Framework迁移,并抛出“实体类型*不是当前上下文模型的一部分”

时间:2019-01-21 06:21:49

标签: entity-framework-6

我的项目有一个现有的数据库,但是现在我们想使用Entity Framework迁移功能来维护它。

我已经创建了CmsDbConfiguration.csCmsDbMigrationConfiguration.csCmsDbMigrator.csCmsMigrationHistoryContext.cs文件。

  1. CmsDbConfiguration.cs继承自System.Data.Entity.DbConfiguration并设置自定义历史记录上下文。

    public class CmsDbConfiguration : DbConfiguration
    {
        public CmsDbConfiguration()
        {
            this.SetHistoryContext(SqlProviderServices.ProviderInvariantName, (connection, defaultSchema) => new CmsMigrationHistoryContext(connection, defaultSchema));
        }
    }
    
  2. CmsDbMigrator.cs继承自用于更新数据库逻辑的System.Data.Entity.Migrations.DbMigrator

    public class CmsDbMigrator : DbMigrator
    {
        public CmsDbMigrator(CmsDbMigrationConfiguration configuration) : base(configuration)
        {
        }
    }
    
  3. CmsDbMigrationConfiguration.cs继承自System.Data.Entity.Migrations.DbMigrationsConfigurationLightCmsDBContext是我的DbContext对象:

    public class CmsDbMigrationConfiguration : DbMigrationsConfiguration<LightCms.Domain.EF.LightCmsDBContext>
    {
        public CmsDbMigrationConfiguration()
        {
            AutomaticMigrationsEnabled = false;
            ContextKey = "EconomySolution";
        }
    
        protected override void Seed(LightCms.Domain.EF.LightCmsDBContext context)
        {
            //  This method will be called after migrating to the latest version.
    
            //  You can use the DbSet<T>.AddOrUpdate() helper extension method 
            //  to avoid creating duplicate seed data.
        }
    }
    
  4. CmsMigrationHistoryContext.cs继承自HistoryContext,它是我的自定义历史记录上下文对象,用于创建我的自定义历史记录上下文数据表。

    public class CmsMigrationHistoryContext : HistoryContext
    {
        public CmsMigrationHistoryContext(DbConnection dbConnection, string defaultSchema) : base(dbConnection, defaultSchema)
        {
        }
    
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            //modelBuilder.Entity<HistoryRow>().ToTable("tbl_migration_history");
            modelBuilder.Entity<HistoryRow>().ToTable(tableName: "tbl_migration_history");
            modelBuilder.Entity<HistoryRow>().HasKey(
                h => new { h.MigrationId, h.ContextKey });
            modelBuilder.Entity<HistoryRow>().Property(h => h.MigrationId).HasColumnName("migration_id").HasMaxLength(150).IsRequired();
            modelBuilder.Entity<HistoryRow>().Property(h => h.ContextKey).HasColumnName("context_key").HasMaxLength(300).IsRequired();
            modelBuilder.Entity<HistoryRow>().Property(h => h.Model).HasColumnName("model").IsRequired().IsMaxLength();
            modelBuilder.Entity<HistoryRow>().Property(h => h.ProductVersion).HasColumnName("product_version").HasMaxLength(32).IsRequired();
        }
    }
    

准备上述4个对象,然后为数据库迁移创建代码逻辑:

public static void InitializeMigrations()
{
        //System.Data.Entity.Database.SetInitializer(new System.Data.Entity.MigrateDatabaseToLatestVersion<LightCmsDBContext, CmsDbMigrationConfiguration>());
        var configuration = new CmsDbMigrationConfiguration();
        //configuration.SetHistoryContextFactory(SqlProviderServices.ProviderInvariantName, (c, e) => new CmsMigrationHistoryContext(c, e));
        var migrator = new CmsDbMigrator(configuration);
        var history = migrator.GetDatabaseMigrations();
        var local = migrator.GetLocalMigrations();
        if (migrator.GetPendingMigrations().Any())
        {
            migrator.Update();
        }
    }

我在global.cs文件的“ Application_Start”事件中调用此方法:

protected void Application_Start(object sender, EventArgs e)
    {
        // The model backing the 'LightCmsDBContext' context has changed since the database was created. 
        // Consider using Code First Migrations to update the database
        //Database.SetInitializer<LightCmsDBContext>(null);
        MvcBootstrapper.InitializeMigrations();
    }

通过“程序包管理器控制台”中的命令“ Add-migration AddMyTestTable”添加迁移文件。 “ 201901200356597_AddMyTestTable”文件将添加到我项目的“ Migrations”文件夹中。

然后,我启动我的应用程序并检查数据库。还创建了tbl_migration_history表,并插入了迁移历史记录数据。但是页面抛出如下异常:

  

用户类型实体不是当前上下文模型的一部分。

     

描述:在执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪,以获取有关错误及其在代码中起源的更多信息。

     

异常详细信息:System.InvalidOperationException:实体类型User不是当前上下文模型的一部分。

     

源错误:

     

第44行:{
  第45行:password = PasswordStrategy.Encrypt(password);
  第46行:返回FindAll()。AsQueryable()。SingleOrDefault(c => c.UserName == userName && c.Password == password);
  第47行:}
  第48行:

     

源文件:E:\ Workspaces \ Private \ EconomySolution \ src \ LightCms.Services \ UserService.cs行:46

     

堆栈跟踪:...

据我了解,“ LightCmsDbContext”目前不起作用,因为“ HistoryContexnt”是当前的DbContenxt,但我不知道如何解决此问题。

任何人都可以帮助我指出原因吗?非常感谢。

PS:我的英语不好,如果有语法问题,请直接更正,非常感谢。

0 个答案:

没有答案