Выполните миграцию Entity Framework с помощью кодов, бросьте «Тип сущности * не является частью модели для текущего контекста» - PullRequest
0 голосов
/ 21 января 2019

В моем проекте есть существующая база данных, но теперь мы хотим использовать функцию миграции Entity Framework для ее обслуживания.

Я создал файлы CmsDbConfiguration.cs, CmsDbMigrationConfiguration.cs, CmsDbMigrator.cs и CmsMigrationHistoryContext.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.DbMigrationsConfiguration, LightCmsDBContext - это мой 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();
        }
    }

Я вызываю этот метод в событии «Application_Start» файла global.cs:

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();
    }

Добавьте файл миграции с помощью команды «Добавить-миграцию AddMyTestTable» в «Консоль диспетчера пакетов». Файл «201901200356597_AddMyTestTable» будет добавлен в папку «Миграции» моего проекта.

Затем я запускаю свое приложение и проверяю базу данных. Создана также таблица tbl_migration_history и вставка данных истории миграции. Но на странице выдается исключение, как показано ниже:

Тип сущности Пользователь не является частью модели для текущего контекста.

Описание: во время выполнения текущего веб-запроса произошло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения об исключении: System.InvalidOperationException: Тип сущности Пользователь не является частью модели для текущего контекста.

Ошибка источника:

Строка 44: {
Строка 45: пароль = PasswordStrategy.Encrypt (пароль);
Строка 46: вернуть FindAll (). AsQueryable (). SingleOrDefault (c => c.UserName == имя пользователя && c.Password == пароль);
Строка 47:}
Строка 48:

Исходный файл: E: \ Workspaces \ Private \ EconomySolution \ src \ LightCms.Services \ UserService.cs Строка: 46

Трассировка стека: ...

Насколько я понимаю, "LightCmsDbContext" в настоящий момент не работает, потому что "HistoryContexnt" является текущим DbContenxt, но я не знаю, как решить эту проблему.

Кто-нибудь может помочь мне указать причину? Большое спасибо.

PS: мой английский не очень хороший, если есть какие-либо проблемы с синтаксисом, пожалуйста, исправьте их напрямую, большое спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...