覆盖" dbo" EntityFramework Code First Migrations中的模式名称

时间:2017-06-28 19:00:08

标签: c# oracle entity-framework-6 ef-migrations

我尝试使用EntityFramework Codefirst和Oracle数据库创建独立于架构的模型,但EF将其用作迁移的默认设置dbo作为架构。 我重写了我的DBContext上的OnModelCreating方法来解决这个问题并在connectionString中使用用户

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
   base.OnModelCreating(modelBuilder);
   modelBuilder.HasDefaultSchema(string.Empty);
}

问题是__MigrationHistory忽略了这个默认架构,我在第一次迁移时遇到了这个错误:

  

ORA-01918:用户' dbo'不存在

尝试this msdn entry来自定义此表的架构。

CustomHistoryContext:

public class CustomHistoryContext : HistoryContext
{
    public CustomHistoryContext(DbConnection dbConnection, string defaultSchema)
            : base(dbConnection, defaultSchema) {}

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.HasDefaultSchema(String.Empty);
    }
}

和DBConfiguration:

public sealed class Configuration :
        DbMigrationsConfiguration<Model.MyDbContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
        SetHistoryContextFactory("Oracle.ManagedDataAccess.Client",
                                 (connection, defaultSchema) => new CustomHistoryContext(connection, defaultSchema));
    }

    protected override void Seed(Model.Model1 context)
    {
    }
}

第一次迁移工作正常。但是当我修改我的实体模型并试图用add-migration命令反映这个变化时,我得到以下错误:

  

无法生成显式迁移,因为以下内容   显式迁移正在等待审核:[201706281804589_initial,   201706281810218_pp2。之前应用挂起的显式迁移   尝试生成新的显式迁移。

看起来EF迷路了,此时无法找到迁移历史记录。

当我在SetHistoryContextFactory中评论Configuration指令时,它适用于后续的add-migration命令,但是这种解决方法对于我想从头开始运行所有迁移的情况来说还不够展开。

有没有人知道我是否能够很好地完成此任务,或者是否有更好的解决方法?

4 个答案:

答案 0 :(得分:1)

转到 Migrations -> Configuration.cs 和下面提到的代码。这个修复对我有用!

class Configuration : DbMigrationsConfiguration<CodeFirstOracleProject.Context>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
        var historyContextFactory = GetHistoryContextFactory("Oracle.ManagedDataAccess.Client");
        SetHistoryContextFactory("Oracle.ManagedDataAccess.Client",
                                 (dbc, schema) => historyContextFactory.Invoke(dbc, "YourSchemaName"));
    }
}

答案 1 :(得分:0)

再次尝试runnig 启用 - 迁移-force 。然后运行添加迁移SomeDescription -IgnoreChanges 。之后,运行“更新 - 数据库 - 详细”。这对我有用

答案 2 :(得分:0)

为了将历史记录模式更改为“测试”,我在Oracle的Configuration : DbMigrationsConfiguration类中成功尝试了以下操作:

var historyContextFactory = GetHistoryContextFactory("Oracle.ManagedDataAccess.Client");
SetHistoryContextFactory("Oracle.ManagedDataAccess.Client",
                         (dbc, schema) => historyContextFactory.Invoke(dbc, "Test"));

因此,基本上,我尝试使用更改后的默认架构注册默认历史上下文,而不是尝试使用未更改的默认架构注册自定义历史上下文。

结果:当我运行Update-Database -Script时,生成的脚本包含用于创建__MigrationHistory表以及插入新历史值的新模式:

create table "Test"."__MigrationHistory"
    -- ...

insert into "Test"."__MigrationHistory"("MigrationId", "ContextKey", "Model", "ProductVersion") ...

但是,让我们非常清楚:我只是凭直觉尝试了我期望的工作,但它确实对我有用。我找不到任何可靠的文档来支持该解决方案。

答案 3 :(得分:0)

打开迁移-> Configuration.cs并添加

 public Configuration()
    {
        AutomaticMigrationsEnabled = false;            
        var historyContextFactory = GetHistoryContextFactory("Oracle.ManagedDataAccess.Client");
        SetHistoryContextFactory("Oracle.ManagedDataAccess.Client",
                                 (dbc, schema) => historyContextFactory.Invoke(dbc, "your_schema_name_hear"));

    }