Activer les migrations avec le contexte dans un assemblage séparé?

J’ai un projet sur lequel je veux exécuter ma update-database mais j’ai mes modèles et mon contexte dans un projet distinct.

Si j’exécute enable-migrations j’obtiens cette erreur: Aucun type de contexte n’a été trouvé dans l’assembly ‘MyProject’.

C’est probablement parce que mon contexte est dans MyProject.MVC.

Si je lance enable-migrations sur MyProject.MVC, je dois append un fichier de configuration d’application. Je ne veux pas faire cela car je veux utiliser le code dans de nombreux projets.

Alors, puis-je exécuter enable-migrations sur MyProject et lui demander de regarder MyProject.MVC pour le contexte?

Cela ne fonctionnera que dans EF 6, mais une version a ajouté le paramètre -ContextProjectName à la commande -enable-migrations . En utilisant cette commande, vous pouvez effectuer les opérations suivantes:

 enable-migrations -ContextProjectName MyProject.MVC -StartUpProjectName MyProject.MVC -ContextTypeName MyProject.MVC.MyContextFolder.MyContextName -ProjectName MyProject 

Cela appenda des migrations à votre projet MyProject utilisant le contexte dans MyProject.MVC . Vous devez vous assurer que le projet avec les Migrations a une référence au projet avec votre contexte, c.-à-d. MyProject référence à MyProject.MVC

Vous ne pouvez exécuter “Activer-Migrations” que dans le projet contenant la classe Contexte de la firebase database.

Votre solution contiendra 2 projets:

 1) MyProject.Models |- Migrations |- 201401061557314_InitialCreate.cs |- Configuration.cs |- MyContext.cs |- App.config (no connection ssortingng) 

App.config

    

 2) MyProject.MVC |- Filters |- InitializeSimpleMembershipAtsortingbute.cs 

InitializeSimpleMembershipAtsortingbute.cs

 namespace MyProject.MVC.Filters { [AtsortingbuteUsage(AtsortingbuteTargets.Class | AtsortingbuteTargets.Method, AllowMultiple = false, Inherited = true)] public sealed class InitializeSimpleMembershipAtsortingbute : ActionFilterAtsortingbute { private static SimpleMembershipInitializer _initializer; private static object _initializerLock = new object(); private static bool _isInitialized; public override void OnActionExecuting(ActionExecutingContext filterContext) { // Ensure ASP.NET Simple Membership is initialized only once per app start LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock); } private class SimpleMembershipInitializer { public SimpleMembershipInitializer() { try { Database.SetInitializer(new MigrateDatabaseToLatestVersion()); using (var context = new MyContext()) { context.Database.Initialize(force: true); if (!context.Database.Exists()) { // Create the SimpleMembership database without Entity Framework migration schema ((IObjectContextAdapter)context).ObjectContext.CreateDatabase(); } } WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true); } catch (Exception ex) { throw new InvalidOperationException("The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588", ex); } } } } } 

Définir MyProject.MVC comme projet de démarrage

Dans le gestionnaire de packages, sélectionnez le projet: MyProject.Models

Exécutez ensuite “Enable-Migrations” pour créer le dossier “Migrations” dans MyProject.Models

Suivi de “Update-Database” -> les migrations utiliseront la chaîne de connexion dans Web.config du projet de démarrage pour effectuer la migration

Voici une solution de contournement:

Ajoutez une classe dans MyProject (le projet pour les migrations). Faites en sorte que cette classe hérite du dbcontext (celui de MyProject.MVC).

Exécutez ensuite les commandes de migration EF sur MyProject.

J’ai eu le même problème et j’utilise EntityFramework 4.3.1. Il semble que EF6 résout ce problème (selon la réponse de @SOfanatic), mais je ne voulais pas passer à EF6 en raison de changements de rupture (dans les DataAnnotations, par exemple).

Donc, ce que j’ai fait pour résoudre ce problème (et ce que j’ai appris dans le processus):

  1. Créez une nouvelle solution (projet vide) et ajoutez le projet pour lequel vous souhaitez activer les migrations (dans votre cas, MyProject.MVC). Vous devrez peut-être installer les packages NuGet requirejs pour pouvoir append le projet existant.

  2. Ajoutez un fichier de configuration avec une chaîne de connexion (ne vous inquiétez pas, cela ne sert qu’à tromper le moteur de migration). Copiez votre firebase database existante dans le dossier de sortie du projet modèle (devrait être MVC \ bin \ Debug dans votre cas). Assurez-vous que la chaîne de connexion dans le fichier de configuration pointe vers cette firebase database:

        
  3. Comme vous êtes dans une nouvelle solution, définissez votre projet de modèle en tant que projet de démarrage (vous pouvez supprimer le projet par défaut).

  4. Exécutez la commande enable-migrations dans la console du gestionnaire de packages. Il devrait créer un dossier Migrations avec deux fichiers: un fichier Configuration.cs et un fichier InitialCreate.cs horodaté. C’est bien d’avoir InitialCreate, c’est pourquoi vous mettez votre firebase database existante dans le dossier de sortie du projet modèle (mais c’est facultatif).

  5. Rechargez votre solution d’origine afin que ces modifications soient mises à jour.

Ce que j’ai appris (pour autant que je sache):

  1. Le moteur de migration a besoin de quelque chose qui ressemble à une connexion valide. Je créais ma chaîne de connexion dans le code (dans un autre projet) et cela n’a pas fonctionné. Je viens de donner au moteur de Migrations une chaîne de connexion “valide” pour la faire fonctionner.
  2. Placez votre firebase database là où le moteur de migration peut le trouver (dossier de sortie du projet modèle) afin de créer un sharepoint départ pour les migrations. Ce sharepoint départ est essentiellement votre schéma de firebase database écrit dans l’API de migration.
  3. Vous pouvez tout restaurer à votre état précédent une fois les migrations mises en place, et cela fonctionne correctement.
  4. Chaque fois que vous souhaitez append manuellement une migration, vous devez “tromper” à nouveau le moteur de migration, comme la première fois. Je n’ai pas essayé avec les migrations automatiques, je suppose que cette approche fonctionne également.

De cette façon, j’utilise une firebase database SQL Server CE 4.0, de sorte que certaines choses sur la chaîne de connexion ont une petite différence par rapport à une firebase database SQL Server ou LocalDB standard. A part ça, tout est pareil.

J’espère que cela est utile et vous donne un aperçu. Veuillez commenter si vous en savez plus sur le fonctionnement de ces migrations.