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

Возможно ли изменить местоположение папки "Миграции" EF Migrations?

По умолчанию команда add-migration пытается создать файл миграции .cs в

  • Корень проекта
    • Миграция

Я хотел бы сохранить мои миграции вместе с остальной частью моего кода, связанного с EF, в папке \Data моего проекта:

  • Корень проекта
    • Данные
      • Миграция

С этой структурой, когда я выполняю

PM> add-migration Migration1

в консоли NuGet появляется следующая ошибка:

    System.IO.DirectoryNotFoundException: Could not find a part of the path 'C:\MyProjectRoot\Migrations\201112171635110_Migration1.cs'.
   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath)
   at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)
   at System.IO.StreamWriter.CreateFile(String path, Boolean append)
   at System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding, Int32 bufferSize)
   at System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding)
   at System.IO.File.InternalWriteAllText(String path, String contents, Encoding encoding)
   at System.IO.File.WriteAllText(String path, String contents)

Можно ли указать местоположение на диске, чтобы файл миграции был создан при выполнении команды add-migration?

4b9b3361

Ответ 1

В конструкторе класса конфигурации добавьте эту строку:

this.MigrationsDirectory = "DirOne\\DirTwo";

Пространство имен будет по-прежнему задано как пространство имен самого класса конфигурации. Чтобы изменить это, добавьте эту строку (также в конструктор конфигурации):

this.MigrationsNamespace = "MyApp.DirOne.DirTwo";

Ответ 2

Указание папки миграции также возможно во время вызова команды enable-migrations (которая создает класс Configuration), используя параметр -MigrationsDirectory:

enable-migrations -EnableAutomaticMigration:$false -MigrationsDirectory Migrations\CustomerDatabases -ContextTypeName FullyQualifiedContextName

В примере будет создан класс Configuration, который устанавливает MigrationsDirectory в указанную папку "Migrations\CustomerDatabases", которая относится к корневой папке проектов.

public Configuration()
{
    AutomaticMigrationsEnabled = false;
    MigrationsDirectory = @"Migrations\CustomerDatabases";
}


См. также эту статью, в которой объясняется проект с несколькими контекстами и папками переноса.

Кстати, если вы используете несколько папок миграций и несколько контекстов, подумайте также о настройке имени для схемы по умолчанию в методе OnModelCreating для вас DbContext производного класса (где конфигурация Fluent-API является). Это будет работать в EF6:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.HasDefaultSchema("CustomerDatabases");
    }

Префикс будет содержать таблицы базы данных с именем схемы. Это позволит вам использовать более одного контекста с одной базой данных в сценарии, где у вас есть несколько групп таблиц, которые независимы от другого. (Это также создаст отдельные версии таблиц MigrationHistory, в приведенном выше примере это будет CustomerDatabases.__MigrationHistory).