我的项目有一个现有的数据库,但是现在我们想使用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();
}
}
我在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:我的英语不好,如果有语法问题,请直接更正,非常感谢。