ОП написал:
Но разве у Add-Migration нет всего необходимого из DbContext и Configuration?
Нет, как упоминалось здесь, часть кода конструктора для ручной миграции (то, что создано add-migration
) содержит снимок схемы вашей базы данных.
Тем не менее, тот факт, что вы используете строку подключения и т. Д., Очень странный. EF обычно подразумевает это из вашего класса(ов) DbContext и Web.Config. В проекте, где у меня есть одна база данных и один DbContext, я создаю класс конфигурации и добавляю ручную миграцию с помощью:
add-migration
Мне не нужно передавать какие-либо другие аргументы командной строки. Это в EF 4.3.1 — возможно, вы использовали CTP или какую-то более старую версию или просто неправильно поняли документы?
Если у меня есть несколько БД или DbContexts, у меня есть несколько классов конфигурации, и я использую, например:
add-migration -conf Log
Который использует мой класс конфигурации и соответствующую строку подключения в Web.config, чтобы добавить ручную миграцию для этой базы данных/DbContext.
Вот более длинный пример кода простого DbContext, предназначенного для хранения журналов (отдельно от основного db):
namespace MyProj.Models.Log
{
public class LogDb : DbContext
{
public DbSet<LogLine> LogLines { get; set; }
public DbSet<LogTag> LogTags { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
}
public LogDb()
#if DEPLOYDB
: base("LogDeploy")
#else
: base()
#endif
{
}
}
namespace MyProj.Migrations
{
internal sealed class Log : DbMigrationsConfiguration<LogDb>
{
public Log()
{
AutomaticMigrationsEnabled = true;
}
}
}
В Web.Config:
<add name="LogDb" connectionString="Initial Catalog=Log;Data Source=.\SqlExpress;Integrated Security=SSPI;MultipleActiveResultSets=true" providerName="System.Data.SqlClient" />
<add name="LogDeploy" connectionString="Initial Catalog=Log;Data Source=00.00.000.00,12345;User ID=sql;Password=xxx;Network Library=DBMSSOCN" providerName="System.Data.SqlClient" />
Итак, в этом примере у меня есть несколько баз данных, несколько DbContexts. LogDb использует другую строку подключения в Web.Config в зависимости от того, определено ли "DBDEPLOY" во время компиляции; если это так, он использует «LogDeploy». Если нет, используется значение по умолчанию — строка подключения с тем же именем, что и у класса, «LogDb». Это позволяет мне легко развертывать изменения БД на сервере с моего локального компьютера, переключая конфигурацию проекта, открывая порт на машине с базой данных SQL и запуская:
> update-database -conf Log
в консоли диспетчера пакетов.
person
Chris Moschini
schedule
11.09.2012