web-dev-qa-db-fra.com

Nom d'objet non valide 'dbo .__ MigrationHistory' utilisant Database.Create; EF6.02 quand la chaîne de connexion est passée

Je rencontre une erreur lorsque j'essaie de créer une base de données à l'aide du code suivant: ..__ Notez que le problème ne se produit pas si la chaîne de connexion n'est pas transmise à . Le problème se produit également lorsque j'exécute le programme dans l'EDI. Cela ne se produit pas si j'exécute le programme .exe ou si j'exécute les tests unitaires dans l'EDI.

Toutefois, si la base de données est créée en exécutant les tests unitaires ou en exécutant le fichier .exe, la table __MigrationHistory est créée dans la section des tables principales, et non dans les tables système.

public Context(string connString, bool AddInitialRecords )
    : base(connString ?? "MyContextName")
{
    this.CheckDatabase(AddInitialRecords);
}

public void CheckDatabase(bool AddInitialRecords)
{
    if (this.Database.Exists())
    {
         // upgrade stuff
    }
    else
    {
       Database.Create();  // error occurs here
        // seeding stuff 
    }
}

Je ne comprends pas le problème si je viens d'utiliser quelque chose comme 

var db1 = new Context();
db1.Database.CreateIfNotExists();

J'ai trouvé de la documentation ici mais cela me trouble. J'installe à partir d'une "version stable", je ne vis sûrement pas quelque chose à partir de 2012? Que pourrais-je faire de mal avec PM?

Le message d'erreur pour le problème est ....

System.Data.Entity.Core.EntityCommandExecutionException s'est produite
HResult = -2146232004 Message = Une erreur s'est produite lors de l'exécution du fichier définition de la commande. Voir l'exception interne pour plus de détails.
Source = EntityFramework StackTrace: sur System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommands (EntityCommand entityCommand, Comportement du comportement CommandBehavior) InnerException: System.Data.SqlClient.SqlException HResult = -2146232060 Message = Nom d'objet non valide 'dbo .__ MigrationHistory' . Source = Fournisseur de données .Net SqlClient ErrorCode = -2146232060 Classe = 16 Numéro de ligne = 1 Nombre = 208 Procedure = "" Serveur =.\SQLEXPRESS Etat = 1 Trace de la pile: at System.Data.SqlClient.SqlConnection.OnError (exception SqlException, Boolean breakConnection, Action`1 wrapCloseInAction) à System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning (TdsParserStateObject stateObj, appelant booléenHasConnectionLock, booléen asyncClose) at System.Data.SqlClient.TdsParser.TryRun (RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject. sur System.Data.SqlClient.SqlDataReader.TryConsumeMetaData () sur System.Data.SqlClient.SqlDataReader.get_MetaData () sur System.Data.SqlClient.SqlCommand.FinishExecuteReader (SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds (CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean .__ async, délai d'expiration Int32, Tâche et tâche, Boolean asyncWrite) at System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String. méthode., achèvement de TaskCompletionSource`1, délai d'attente Int32, tâche & task, as.) sur System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) sur System.Data.SqlClient.SqlCommand.ExecuteReader (CommandBehavior behavior, méthode String) à System.Data.SqlClient.SqlCommand.ExecuteDbDataReader (comportement CommandBehavior ) sur System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher. <> c__DisplayClassb.b__8 () at System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch [TInterceptionContext, TResult] (opération Func`1 , TInterceptionContext interceptionContext, Action`1 exécutant, Action`1 exécuté) à System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.Reader (DbCommand commande, DbCommandInterceptionContext interceptionContext) à System.Data.Entity.Internal.InterceptableDbCommand.ExecuteDbDataReader (CommandBehavior behavior) sur System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommands (EntityCommand entityCommand, Comportement de CommandBehavior) InnerException:

28
Kirsten Greed

Cela est dû au fait que EF recherche certaines informations dans la table __MigrationsHistory. Par exemple, vous pouvez utiliser EF avec une base de données existante qui n'a pas été créée à l'aide de EF Migrations mais EF n'a aucun moyen de le savoir. Il essaie donc de se connecter à la base de données et utilise la table pour le vérifier. Si la table n'existe pas, une exception sera levée. EF intercepte ensuite l’exception et prend les mesures qui s’imposent (par exemple, si nécessaire, crée la table __MigrationsHistory ou continue sans utiliser les migrations). 

En général, vous ne verrez pas cette exception lors d'une exécution sans le débogueur. Cependant, lors du débogage de votre codeET, lorsque l'option permettant d'interrompre l'exécution lorsqu'une exception est générée est définie, toutes les exceptions générées, même si elles sont traitées en interne, ne sont jamais atteintes. Le paramètre par défaut ne doit pas être interrompu lorsque l'exception est levée, mais uniquement lorsqu'une exception non gérée est générée. Vous pouvez modifier le paramètre en cochant/décochant une case dans la colonne "Transmis" de la boîte de dialogue Débogage -> Exceptions.

Dans VS 2017, vous ouvrez les paramètres d'exception à l'aide de Debug-> Windows-> Paramètres d'exception. Si vous cliquez avec le bouton droit de la souris sur les "Exceptions du langage commun", vous pouvez sélectionner le "Rétablir les valeurs par défaut" qui désactive la suppression de votre programme lorsque la plupart des exceptions sont levées.

66
Pawel

Vous pouvez désactiver le premier code d'initialisation de la base de données pour votre base de données en ajoutant ceci au constructeur de votre contexte:

Database.SetInitializer<YourContext>(null);

Cela devrait empêcher la tentative d'accéder à dbo.__MigrationHistory.

8
Danny Varod

J'ai fait face au même problème. Cela signifie que EF ne peut pas trouver la table d'historique __Migration. notez également pour une raison quelconque que cela doit être dbo .__ MigrationHistory (note dbo) Assurez-vous que vous avez exécuté "update-database" au moins une fois avant d'exécuter le contexte.

1
Rishabh Jain