Entity Framework 5 attend la colonne CreatedOn de la table MigrationHistory

je suis en train de migrer une application MVC 3 de EF 4.3 vers EF 5. J'ai remarqué que EF 5 attend un CreatedOn colonne __MigrationHistory table, qui n'existe pas car les migrations ont été créées par une version plus ancienne.

SELECT TOP (1) 
[c].[CreatedOn] AS [CreatedOn]
FROM [dbo].[__MigrationHistory] AS [c]

comment résoudre ce problème sans effacer Mon historique migratoire? Je pense à une requête en déduire la valeur de la colonne du nom de migration, qui est dans le format suivant:

201203111201542_MigrationName
20
demandé sur CMircea 2012-08-16 04:10:52

5 réponses

la colonne CreatedOn n'est plus nécessaire. Nous tentons de l'interroger afin de déterminer si nous devons l'abandonner. c'est-à-dire que vous passez de 4.3 à 5.

6
répondu Andrew Peters 2012-08-22 16:48:07

comme L'a dit Filip Cornelissen, C'est une chose entre Miniprofileurs.EF et Entity Framework 5.0.

résoudre / cacher le problème est en fait plus facile que vous le pensez. Ce n'est qu'un "problème de débogage" car l'erreur que vous obtiendrez ne se produit qu'au cours de la période d'instanciation (vérification des nouvelles migrations), et l'erreur est une "Exception SQL Unhandeld".

Donc, la résolution de ce problème est simple:

allez dans Visual Studio à votre onglet "Débogage". Frapper la "Exceptions" point. Dans la nouvelle boîte de dialogue, vous ouvrez l'arbre "Common Language Runtime Exceptions". Sous "Système.Données.SqlClient, décocher les deux cases à cocher après "système".Données.SqlClient.SqlException". Ajouter, si ce n'est pas là.

et c'est parti!

6
répondu s.meijer 2012-11-18 18:10:26

semble être une chose dans le code EF d'abord avec migrations activées, lorsque vous mettez à jour à partir de EF4.* à EF 5.0. Et ça en combinaison avec Miniprofileur. La table existait en dbo._MigrationHistory sous les tables de système.

Vous essayez de faire quelques petites choses:

  1. vous pouvez ajouter la colonne CreatedOn (DateTime) manuellement à dbo._MigrationHistory table sous System tables folder.
  2. vous pouvez arrêter de détecter des changements en paramétrant la Configuration.Modificationsautodetectecteenabled = false;
  3. Commenter cette ligne MiniProfilerEF.Initialize (), désactivant le profilage EF.

voici un exemple de la méthode seed pour ajouter la colonne CreatedOn. Cette colonne sera supprimée chaque fois que le contexte est initialisé. La méthode seed est dans la classe de Configuration du contexte.

internal sealed class Configuration : DbMigrationsConfiguration<MyContext>
{
    protected override void Seed(MyContext context)
    {
        //  This method will be called after migrating to the latest version.

        // Hide error Invalid column name 'CreatedOn' from mini profiler.
        context.Database.ExecuteSqlCommand(
            @"IF NOT EXISTS(SELECT * FROM sys.columns WHERE object_id = OBJECT_ID('__MigrationHistory') AND name = 'CreatedOn')
                ALTER TABLE dbo.__MigrationHistory ADD CreatedOn datetime NOT NULL CONSTRAINT DF___MigrationHistory_CreatedOn DEFAULT (SYSUTCDATETIME());
        ");
    }
}
5
répondu Filip Cornelissen 2017-03-06 17:47:23

selon la réponse de Filip Cornelissen le script suivant corrige ce problème

--IF OBJECT_ID('dbo.__MigrationHistory') IS NOT NULL

ALTER TABLE dbo.__MigrationHistory ADD CreatedOn DateTime Default GETDATE()
GO
UPDATE dbo.__MigrationHistory SET CreatedOn = GETDATE()
4
répondu Yegor 2012-12-12 00:54:41

Voici une solution que j'utilise. Personnellement, je suis D'accord avec le fait d'appuyer deux fois sur la flèche verte (démarrer le débogage et ensuite continuer), mais si vous voulez vraiment qu'il cesse de casser, essayez cet événement de post Build qui supprimera le Miniprofileur PDB:

del "$(TargetDir)MiniProfiler.pdb" /q /s

mise à jour: si c'est trop de travail pour vous, j'ai créé un NuGet package:

PM> Install-Package MiniProfilerContrib.EFMigrationsFix
3
répondu jrummell 2015-01-14 19:36:31