Est-il possible de changer L'emplacement du dossier "Migrations" EF Migrations?

Par défaut, la commande add-migration tente de créer la migration .fichier cs dans

  • Racine Du Projet
    • Migrations

Je voudrais stocker mes migrations avec le reste de mon code lié à EF dans le dossier Data de mon projet:

  • Racine Du Projet
    • Données
      • Migrations

Avec cette structure, quand j'exécute

PM> add-migration Migration1

Dans la console NuGet, je reçois ce qui suit erreur:

    System.IO.DirectoryNotFoundException: Could not find a part of the path 'C:MyProjectRootMigrations201112171635110_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)

Est-il possible de spécifier l'emplacement sur le disque où le fichier de migration doit être créé lors de l'exécution de la commande add-migration?

35
demandé sur Betty 2011-12-17 20:44:42

2 réponses

Dans le constructeur de la classe de configuration, Ajoutez cette ligne:

this.MigrationsDirectory = "DirOne\\DirTwo";

L'espace de noms continuera d'être défini comme l'espace de noms de la classe de configuration elle-même. Pour changer cela, ajoutez cette ligne (également dans le constructeur de configuration):

this.MigrationsNamespace = "MyApp.DirOne.DirTwo";
56
répondu Roger 2012-05-31 02:25:43

La spécification du dossier migrations est également possible lors de l'appel de la commande enable-migrations (qui crée la classe Configuration), en utilisant le paramètre -MigrationsDirectory:

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

L'exemple va créer une classe Configuration qui définit le MigrationsDirectory dans le dossier spécifié 'Migrations\CustomerDatabases' qui est relatif au dossier racine des projets.

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


Voir Aussi cet article qui explique un projet avec des contextes multiples et la migration dossier.

En passant, si vous utilisez plusieurs dossiers de migrations et plusieurs contextes, veuillez également envisager de définir un nom pour le schéma par défaut dans la méthode OnModelCreating de votre classe dérivée DbContext (où se trouve la configuration Fluent-API). Cela fonctionnera dans EF6:

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

Le préfixe vous tables de base de données avec le nom du schéma. Cela vous permettra d'utiliser plus d'un contexte, avec une seule base de données dans un scénario où vous avez plusieurs groupes de tables qui sont indépendants les uns des autres. (Cela créera également des versions séparées des tables MigrationHistory, dans l'exemple ci-dessus, ce serait CustomerDatabases.__MigrationHistory).

11
répondu Martin 2015-08-26 13:09:41