oskr
oskr

Reputation: 189

Override "dbo" schema name in EntityFramework Code First Migrations

I'm trying to create an schema independent model with EntityFramework Codefirst and an Oracle database but EF uses as defaults for migrations dbo as schema. I overridden OnModelCreating method on my DBContext to solve this and use the user in the connectionString instead

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

The problem is that __MigrationHistory ignores this default schema and I get this error when running first migration:

ORA-01918: User 'dbo' does not exist

Tried this msdn entry to customize the schema for this table.

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

And 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)
    {
    }
}

And is working fine for the first migration. But when I modify my entity model and try to reflect this change with add-migration command I get the following error:

Unable to generate an explicit migration because the following explicit migrations are pending: [201706281804589_initial, 201706281810218_pp2]. Apply the pending explicit migrations before attempting to generate a new explicit migration.

Looks like EF gets lost and can't find migrations history at this point.

When I comment the SetHistoryContextFactory instruction in Configuration it works for subsequent add-migration commands but this workaround isn't enough for scenarios when I want to run all migrations from scratch like deploying.

Does anyone knows if I'm in the good way to accomplish this or if there is a better workaround for this?

Upvotes: 5

Views: 4227

Answers (4)

Hamid Mahmood
Hamid Mahmood

Reputation: 31

Go to Migrations -> Configuration.cs and below mentioned code. This fix worked for me!

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

Upvotes: 1

Hamada Omara
Hamada Omara

Reputation: 11

open Migrations -> Configuration.cs and add

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

    }

Upvotes: 0

grek40
grek40

Reputation: 13438

I successfully tried the following inside the Configuration : DbMigrationsConfiguration class for Oracle, in order to change the history schema to "Test":

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

So basically, instead of trying to register a custom history context with unchanged default schema, I tried to register the default history context with changed default schema.

The result: when I run Update-Database -Script, the resulting script contains the new schema for creation of the __MigrationHistory table as well as for inserting the new history values:

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

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

However, lets be perfectly clear: I just tried what I expected to work by intuition and it did work for me. I didn't find any reliable documentation to support this solution.

Upvotes: 0

Luiz Felipe
Luiz Felipe

Reputation: 57

Try runnig Enable-Migrations -force again. Then run Add-Migration SomeDescription –IgnoreChanges. After that, run "Update-Database - Verbose". This worked to me

Upvotes: 0

Related Questions