在Entity Framework for MySql数据库中运行update-Database时,表'xxx .__ MigrationHistory'不存在错误

时间:2015-08-26 11:34:02

标签: mysql entity-framework

目前我有一个使用Entity Framework 6.1.3和Sql Server 2012的应用程序。我为我的数据库使用Code first migration方法。在Sql Server DB中,我创建了具有模式名称作为表前缀的表,例如TestDB.TestSchema.tblXyz,其中TestDB是我的数据库,TestSchema是我的模式名称。

现在我想更改我的应用程序以使用MySql数据库并遵循相同的表名和模式约定。

我重写了HistoryContext类的onModelCreating方法,为表添加了一个前缀,如下所示,

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.HasDefaultSchema("TestSchema");
        modelBuilder.Entity<HistoryRow>().Property(h => h.MigrationId).HasMaxLength(128).IsRequired();
        modelBuilder.Entity<HistoryRow>().Property(h => h.ContextKey).HasMaxLength(200).IsRequired();
    }

但是当我在包管理器控制台中运行update-database -verbose命令时,它给出了错误 “表' TestDB .__ MigrationHistory '不存在”。

以下是运行迁移时生成的脚本的一部分:

create table `TestSchema.__MigrationHistory` (`MigrationId` varchar(128)  
not null    ,`ContextKey` varchar(200)  not null ,`Model` longblob 
not null,`ProductVersion` varchar(32)  not null ,primary key (
`MigrationId`,`ContextKey`) ) engine=InnoDb auto_increment=0
INSERT INTO `__MigrationHistory`( ...

正如您在插入__MigrationHistory表时所看到的那样,它没有为模式名称添加前缀。因此导致上述错误。

还有其他人遇到过同样的问题吗?在这里可以做些什么来使实体框架选择正确的表名?

...谢谢

1 个答案:

答案 0 :(得分:0)

您必须删除此行:

modelBuilder.HasDefaultSchema("TestSchema");

然后EF停止为每个表名添加模式前缀。 表将在连接字符串中指定的表空间中创建(参数&#34;初始目录= ...&#34;是app.config)。