В моем проекте есть существующая база данных, но теперь мы хотим использовать функцию миграции Entity Framework для ее обслуживания.
Я создал файлы CmsDbConfiguration.cs
, CmsDbMigrationConfiguration.cs
, CmsDbMigrator.cs
и CmsMigrationHistoryContext.cs
.
CmsDbConfiguration.cs
наследуется от System.Data.Entity.DbConfiguration
и задает пользовательский контекст истории.
public class CmsDbConfiguration : DbConfiguration
{
public CmsDbConfiguration()
{
this.SetHistoryContext(SqlProviderServices.ProviderInvariantName, (connection, defaultSchema) => new CmsMigrationHistoryContext(connection, defaultSchema));
}
}
CmsDbMigrator.cs
наследуется от System.Data.Entity.Migrations.DbMigrator
, используемого для обновления логики базы данных.
public class CmsDbMigrator : DbMigrator
{
public CmsDbMigrator(CmsDbMigrationConfiguration configuration) : base(configuration)
{
}
}
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.
}
}
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: мой английский не очень хороший, если есть какие-либо проблемы с синтаксисом, пожалуйста, исправьте их напрямую, большое спасибо.