2013-04-08 1 views
1

Я создал базу данных в Azure, настроив свое собственное имя. Затем я создал первые EF 5-коды и добавил миграции. При запуске приложения я назвал эти две строки:EF 5 + Azure + MigrationFirst переопределяет имя базы данных. Зачем?

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

Строка соединения берется прямо из Azure: Server = ТСР: xxx.database.windows.net, 1433; Database = DbName; ID пользователя = YYY; Password = zzz; Trusted_Connection = False; Шифрование = Истина; Время ожидания подключения = 30;

В кулачном вызове я ожидал, что база данных dbName будет заполнена таблицами в соответствии с схемой POCO. Но вместо того, чтобы новая база данных создаются с полным именем пространства имен моего контекста: MyService.Business.Entity.MyContext

Почему миграция не принимает имя базы данных, указанное в строке подключения?

+1

если вы дон 't передать строку подключения, как показано Крисом ниже EF, попробует использовать строку подключения из файла конфигурации, имя которой совпадает с именем контекста. Если он не найден, он создаст свою собственную строку соединения, в которой будет создано имя базы данных на основе имени контекста. – Pawel

+0

Спасибо за объяснение! –

ответ

1

Вы можете указать имя базы данных или имя соединения строки в конструкторе DbContext:

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

Странно, что база данных должна быть указана дважды, чтобы заставить ее работать, но по крайней мере она работает. Благодаря! –

+0

Вы не указали _have_, чтобы указать его дважды. Как правило, я не указываю строку подключения на фабрике соединений, только одну в стандартной секции конфигурации connectionStrings. –

1

Мое впечатление, что в случае, когда строка соединения передается в коде, а не получена из app.config, EF изворотливает о том, как она получает строку соединения.

мне пришлось добавить класс, унаследованный от IDBContectFactory

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

     return context; 
    } 
} 

Кроме того, для того, чтобы создать миграцию, мне нужно следующее в моем контексте класса

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

Если ConnectionStringName установлен в моем app.config.

Я все еще озадачен, что я должен был сделать это, и попросил об этом here