Jakob Lithner
Jakob Lithner

Reputation: 4416

EF 5 + Azure + MigrationFirst overrides database name. Why?

I created a database in Azure setting my own custom name. I then created EF 5 code first entities and added migrations. On application startup I called these two lines:

        Database.DefaultConnectionFactory = new SqlConnectionFactory(connectionString);
        Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDataContext, MyConfiguration>());

Connection string is taken straight from Azure: Server=tcp:xxx.database.windows.net,1433;Database=dbName;User ID=yyy;Password=zzz;Trusted_Connection=False;Encrypt=True;Connection Timeout=30;

On fist call I expected database dbName to be filled with tables according to POCO schema. But instead a NEW database is generated with the complete namespace name of my context: MyService.Business.Entity.MyContext

Why will the migration not accept the database name specified in the connection string?

Upvotes: 1

Views: 135

Answers (2)

Chris Curtis
Chris Curtis

Reputation: 1478

You can specify the Database name or connection string name in the constructor of your DbContext:

public class MyDataContext : DbContext
{
    public MyDataContext: base("DbNameOrConntectionStringNameHere")
    {
    }
}

Upvotes: 1

Kirsten
Kirsten

Reputation: 18066

My experience is that, in the case where the connection string is being passed in code, rather than obtained from app.config, EF is quirky about how it obtains the connection string.

I had to add a class that inherited from IDBContectFactory

  public class ContextFactory : IDbContextFactory<Context>
  {
    public Context Create()
    {
        var s = (string)AppDomain.CurrentDomain.GetData("ConnectionString");
        var context = new Context(s);

        return context;
    }
}

Also, in order to create a migration, I needed the following in my context class

// uncomment when creating migration - comment out after migration is created
public Context() : base("ConnectionStringName"){}

Where the ConnectionStringName is set up in my app.config.

I am still mystified that I had to do this and have asked about it here

Upvotes: 1

Related Questions