Подтвердить что ты не робот

Как явное имя базы данных при использовании Entity Framework Migrations 4.3

Недавно я начал использовать миграции Entity Framework и заметил, что имя базы данных не тянет за мной, когда я запускаю команду Update-Database.

Моя строка соединения:

<connectionStrings>
<add name="DataContext" connectionString="Server=.\SQLEXPRESS;Initial Catalog=TestDB;Trusted_Connection=Yes;" providerName="System.Data.SqlClient" />
</connectionStrings>

В первый раз, когда я запускаю Update-Database, моя база данных создается с правильным именем TestDB. Однако, как только я вношу изменения в один из моих сущностей, он больше не будет обновляться для меня, если я не добавлю имя проекта запуска (я использую решение для нескольких проектов):

Update-Database -StartUpProjectName "TestDB.Data"

Затем создается другая новая база данных, миграция которой всегда будет продолжать использоваться. Я не против вставлять команду StartUpProjectName, но есть ли способ переопределить имя по умолчанию для создаваемой базы данных? Он всегда создает базу данных как

TestDB.Data.DataContext

Есть ли способ гарантировать, что база данных, созданная при передаче имени StartUpProject, просто называется TestDB или это ограничение использования параметра StartUpProjectName?

В качестве примечания, я думаю, что причина, по которой мне нужно указать StartUpProjectName, заключается в том, что у меня есть многоуровневая настройка проекта. Файл конфигурации Migrations находится в моем проекте "Данные", объекты/модели находятся в моем проекте "Домен" и т.д. У меня также нет параметров инициализации в файле Global.asax.cs, как я бы использовал ранее сначала код ef 4.2. Поэтому в моем проекте у меня просто есть DataContext в моем проекте Data и Migrations Configuration в этом проекте.

EDIT:

Поскольку я изначально задал этот вопрос, я наткнулся на "правильный" способ назвать базу данных в многопроектном решении. Хотя ответ ниже будет работать, это означает, что вы дублируете свой web.config в другой области, которая не является идеальным решением. Вместо этого вы можете просто поместить имя в свой DbContext, выполнив что-то вроде этого (DataContext - это просто имя, которое я использовал в моем проекте):

public class DataContext : DbContext
{
    public DataContext() : base("DatabaseNameHere")
    { }

    public DbSet<Table1> Table1 { get; set; }
    public DbSet<Table2> Table2 { get; set; }

    public virtual void Commit()
    {
        base.SaveChanges();
    }
}

Спасибо,

Рич

4b9b3361

Ответ 1

При выполнении update-database вы должны указать проект, содержащий миграции. Убедитесь, что у вас есть файл app.config в этом проекте, который содержит правильную строку соединения.

При разбиении приложения на несколько проектов строка соединения, используемая при запуске приложения, является одним из запущенных проектов. При переносе используется используемая строка соединения - это один из проектов, содержащих миграции.

Когда я сделал аналогичную настройку, мне пришлось добавить строку подключения в два места. Немного неудобно, но он работает.

Ответ 2

Вы можете избежать управления им в app.config, предложив его как параметр:

Update-Database -Verbose 
 -ConnectionString "CONNECTIONSTRING" 
 -ConnectionProviderName "System.Data.SqlClient"
 -StartupProjectName WEBSITE_PROJECT -ProjectName MIGRATION_PROJECT

Легко-пьешь, если вы любите печатать бесконечно.

Ответ 3

У вас может быть строка подключения, хранящаяся в файле web.config в проекте вашего сайта, а также файлы DBContext и миграции в другом проекте и по-прежнему использовать одну и ту же строку соединения. Однако вам необходимо убедиться в том, что, как и для проекта Data (или любого другого проекта с DBContext и т.д.) В качестве проекта по умолчанию для консоли диспетчера пакетов, вы ТАКЖЕ должны быть уверены, что ваш веб-сайт установлен к проекту StartUp по умолчанию!

Я не вижу этого документально нигде, но безумные 24 часа неспособности понять, почему мои миграции, которые внезапно применяются к SQLExpress db, привели меня к такому выводу.

Ответ 4

Я пробовал с последним EF5 от Nuget.

Однако Update-Database не читает App.config из проекта, который содержит миграции (точно так же, как ответ 1 год назад), но он будет читать *.config из запуска проекта. Это замечательно, но я узнаю, как Add-Migration и Update-Database найти подходящую строку соединения здесь:

  • Сначала пытается получить строку подключения по умолчанию "DefaultConnection"
  • Затем он пытается получить имя строки подключения на основе имени класса контекста. Например. У меня есть класс MyContext, полученный из DbContext, поэтому я могу использовать имя строки подключения "MyContext". Полезно, когда у меня несколько соединений db.
  • Если оба указанных имени строки соединения не найдены, он не будет работать и не будет показывать строку соединения "DefaultConnection" , если вы не укажете параметр -ConnectionStringName. См. get-help Update-Database для просмотра страницы справки в консоли диспетчера пакетов.

Нет попытки повтора или возврата, поэтому, если "DefaultConnection" содержит неправильную строку соединения, она просто покажет ошибку.

Если в строках подключения существуют как DefaultConnection, так и имя контекста, приоритет будет иметь значение DefaultConnection.

Я предпочел бы, чтобы # 2 стал первой попыткой, потому что имя более конкретное, но вышеуказанные шаги - это то, что EF5 Migrations делают при попытке подключиться к db.