2011-12-17 2 views
34

По умолчанию, команда пытается надстройка миграции для создания миграционного .cs файла вВозможно ли изменить местоположение папки Eig Migrations «Migrations»?

  • Project Root
    • Миграция

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

  • Project Root
    • данных
      • Миграции

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

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?

+0

Обратите внимание на решение Роджера в качестве ответа. Это сработало для меня. Благодарю. – jordanbtucker

ответ

55

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

this.MigrationsDirectory = "DirOne\\DirTwo"; 

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

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

+1 спас меня от хлопот. Я просмотрел все мои видеоролики Pluralsight, пытаясь найти пример, который не наследует эту конфигурацию по умолчанию для расположения папки миграции. Ты спасатель. – JustinMichaels

+0

Есть ли способ указать это в файле 'web.config'? –

+0

Где этот класс конфигурации? –

10

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

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

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

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


Смотрите также this статью, которая объясняет о проекте с несколькими контекстами и папками миграции.

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

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

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