27 votes

EF4 Code-First provoque InvalidOperationException

Je vais avoir un problème lorsque vous essayez d'exécuter mon projet à chaque fois qu'il construit. Il semble que l'initialiseur fonctionne, mais quand il s'agit de la première requête, il meurt à la suite de InvalidOperationException.

This operation requires a connection to the 'master' database. Unable to create a
connection to the 'master' database because the original database connection has
been opened and credentials have been removed from the connection string. Supply
an unopened connection.

Pour référence, je suis à l'utilisation de l'EF Premier Code CTP4, importés directement avec NuGet. La connexion à un Serveur SQL server 2008 R2

Ce que je veux est de re-créer la base de données s'il y a des modifications au modèle et des semences avec quelques valeurs de la table de recherche. Les deux de ces choses semblent être prises en charge* la sortie de la boîte.

Ma configuration est comme suit:

Mondiale.asax

 protected void Application_Start()
 {
    Database.SetInitializer<CoreDB>(new CoreDBInitialiser());
    // et al...
 }

CoreDB.cs

public class CoreDB : DbContext
{
    public DbSet<User> Users { get; set; }
    public DbSet<Login> Logins { get; set; }
    public DbSet<Permission> Permissions { get; set; }
    public DbSet<Role> Roles { get; set; }
    public DbSet<RolePermission> RolePermissions { get; set; }
    public DbSet<UserRole> UserRoles { get; set; }
    public DbSet<Setting> Settings { get; set; }
}

public class CoreDBInitialiser : RecreateDatabaseIfModelChanges<CoreDB>
{
    protected override void Seed(CoreDB context)
    {
        var settings = new List<Setting>
        {
            new Setting
            {
                SettingName = "ExampleSetting",
                SettingValue = "This is a sample setting value",
            }
        };

        settings.ForEach(d => context.Settings.Add(d));
    }
}

Lorsqu'il s'exécute, il meurt sur une ligne similaire à ce, qui est essentiellement la première requête, il vient à travers après la création de la base de données.

User data = (from u in _data.Users where u.Username == userName  select u).SingleOrDefault();

Des choses que je ne pense pas que c'est:

  • Ce n'est pas les autorisations: j'ai supprimé la base de données elle-même au sein de SQL Server. L'application recrée autour environ le même temps que cette requête est tenté d'exécuter (l'initialiseur est définie, alors évidemment, il est titulaire de créer jusqu'à ce qu'il est nécessaire). J'ai aussi ouvert une session sur SQL Server en tant qu'utilisateur spécifié dans mon Web.config et ils ont plein accès en lecture/écriture à la base de données. En fait, ils devraient probablement faire tant que ce compte crée les bases de données également.
  • La base de données est créée: la Suppression de la DB et automatiquement recrée amende.
  • La chaîne de connexion est correctement définie, y compris l' providerName d'attribut.

<add name="CoreDB" connectionString="Data Source=localhost\SQLEXPRESS;Initial Catalog=TheDatabase;User Id=TheUsername;Password=ThePassword;" providerName="System.Data.SqlClient" />

  • Il n'a pas semble être un bug dans mon code/logique, car une fois que la requête a échoué avec succès, le code va démarrer correctement jusqu'à ce que la prochaine fois que l'application est reconstruit. C'est évidemment pourrait être, et il est probable que j'aurais du appliquer un travail autour de dans mon code n'importe quoi de toute façon. :)

Que faire?

Idéalement, je voudrais à "ne pas penser le schéma de base de données" beaucoup. J'aimerais qu'il soit comme il semblait être dans Scott Gu de l'excellent billet de blog (et suivi pour travailler avec des bases de données existantes) où les choses travaillé et a disparu à l'écart. Pour la plupart, c'est vrai. Il semble être un problème avec la connexion n'étant pas fermé à un certain point, mais je ne trouve pas comment corriger ce problème.

Un peu de forum / , de SORTE que les postes impliquent la question que je vais avoir est essentiellement parce que les initialiseurs ne fonctionnent pas exactement comme prévu et la connexion peut être laissée ouverte. La solution dans d'autres endroits, semble être tout simplement de "ne pas créer votre propre initialiseur", ce qui n'est pas la meilleure solution mais si quelqu'un a des idées, je vais probablement avoir à faire jusqu'à ce que CTP5 peut-être.

*oui, je sais que c'est une CTP, donc "pris en charge" n'est probablement pas le mot :)

40voto

bizon Points 1225

Je sais que c'est trop tard pour la réponse, mais ce post est haut sur Goolge et la réponse peut être utile pour quelqu'un. Le problème manque des informations d'identification. Pour éviter cela, vous devez modifier votre chaîne de connexion pour avoir:

 Trusted_Connection=False;Persist Security Info=True
 

Basé sur cet article

6voto

Ben Anderson Points 1454

Comme demandé je suis de poster mon commentaire comme une réponse.

Ma solution a été très similaire à bizon où la Trusted_Connection et Persist Security Info la correction nécessaire, mais je l'a accompli par le biais de visual studio propriétés en allant à:

L'Explorateur de serveur -> Modifier la Connexion -> Avancé -> Puis cocher les deux Persist Security Info et TrustServerCertificate comme Vrai, et il formaté la chaîne de connexion correctement

screenshot of visual studio gui

2voto

AmareKnight Points 461

Il suffit de lancer ce problème alors que je suis ce sous VS2012 et EF6. Ma solution est assez simple:

Dans la boîte de dialogue Propriétés de connexion qui apparaît lorsque vous choisissez "Reverse Engineering Code First", cochez "Enregistrer mon mot de passe".

Problème résolu, mais je ne connais pas les détails à ce sujet ...

0voto

Amadiere Points 5606

Je n'ai pu obtenir que cela fonctionne comme je le voulais. Cette réponse est un bodge / opt-out, donc être conscient lors de la prise de décision sur ce qu'il faut faire.

J'ai été rétrocédés à l'écart de Code-Première de la en attendant, jusqu'à une version plus stable. Pour tous ceux qui ont ce problème avec le CTP4 ainsi, alors vous pouvez obtenir autour de lui par la perte de votre initialiseur et passage de la valeur NULL dans l' SetInitializer méthode.

Database.SetInitializer<CoreDB>(null);

Bien sûr, cela signifie que vous avez besoin pour maintenir votre base de données chaque fois que vous effectuez une modification, ou la changer pour une seule série, et puis changer de nouveau après qu'il crée de la DB.

0voto

user1308816 Points 1

Jamais posté avant, l'apprentissage de l'Entity Framework en utilisant MVC, à l'aide de 2010 et un dev serveur de base de données qui exécute SQL Server 2005 pour la base de données. Je suis principalement une application windows gars.

Première partie du tutoriel s'est bien passé, il a créé les trois tables jusqu'à présent, puis j'ai rencontré l'erreur ci-dessus après l'ajout de certains plus de classes et de la base de données de structure nécessaires pour le changement.

Mon correctif a été assez brutal, je suis allé sur le serveur de dev, et alla dans mon login et je suis un sysadmin sur mon propre serveur, pas surprenant. Je suis donc allé dans usermapping et sélectionné des maîtres et des coché toutes les cases. Il fonctionne maintenant.

Je ne sais pas pourquoi cela a fonctionné ou ce qu'est la question, mais j'espère que quelqu'un qui en sait plus que moi peut s'appuyer sur ce "mauvais réparer" et de faire mieux pour les autres qui ont ce problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X