EF4 Code-First provoque une exception InvalidOperationException

c# code-first database ef-code-first entity-framework

Question

Je rencontre un problème lorsque j'essaie de lancer mon projet à chaque fois qu'il se construit. Il semble que l’initialiseur s’exécute, mais s’agissant de la première requête, il meurt avec l’ InvalidOperationException suivante.

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, j'utilise le code EF First Code CTP4, importé directement avec NuGet. Connexion à un serveur SQL Server 2008 R2

Ce que je souhaite, c’est de recréer la base de données s’il existe des modifications de modèle et de l’ensemencer avec quelques valeurs pour la table de recherche. Ces deux éléments semblent être pris en charge * immédiatement.

Ma configuration est la suivante:

Global.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));
    }
}

Lors de son exécution, il meurt sur une ligne similaire à celle-ci, qui est essentiellement la première requête rencontrée 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:

  • Ce ne sont pas des autorisations : j'ai supprimé la base de données elle-même dans SQL Server. L'application le recrée à peu près au même moment que la tentative d'exécution de la requête (l'initialiseur est défini, puis, évidemment, il s'abstient de créer jusqu'à ce que cela soit nécessaire). J'ai également ouvert une session sur SQL Server en tant qu'utilisateur spécifié dans mon fichier Web.config et ils disposent d'un accès complet en lecture / écriture à la base de données. En fait, ils devraient probablement faire comme ce compte crée également les bases de données.
  • La base de données est en cours de création : Suppression de la base de données et elle est automatiquement recréée.
  • La chaîne de connexion est correctement définie , y compris l'attribut providerName .

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

  • Cela ne semble pas être un bogue dans mon code / logique, car une fois que la requête a échoué, le code démarrera correctement jusqu'à la prochaine reconstruction de l'application . C'est évidemment possible, et je devrais probablement appliquer un contournement dans mon code, quoi qu'il en soit. :)

Que faire?

Idéalement, j'aimerais "ne pas trop penser au schéma de base de données". J'aimerais que ce soit comme dans l'excellent blog de Scott Gu (et son suivi pour travailler avec des bases de données existantes ), où les choses ont bien fonctionné et ont disparu. Pour la majeure partie, c'est vrai. Il semble y avoir un problème avec le fait que la connexion ne soit pas fermée à un moment donné, mais je ne trouve pas comment remédier à ce problème.

Quelques messages de forum / SO suggèrent que le problème que je rencontre est essentiellement dû au fait que les initialiseurs ne fonctionnent pas exactement comme prévu et que la connexion peut rester ouverte. La solution dans d'autres endroits semble être simplement "ne créez pas votre propre initialiseur", ce qui n'est pas la meilleure solution - mais à moins que quelqu'un n'ait des idées, je devrai probablement le faire jusqu'à CTP5 peut-être.

* Oui, je sais que c'est un CTP, donc "supporté" n'est probablement pas le mot :)

Réponse acceptée

Je sais qu’il est trop tard pour répondre, mais ce message est prioritaire sur Goolge et répondre peut être utile pour quelqu'un. Le problème est des informations d'identification manquantes. Pour éviter cela, vous devez changer votre chaîne de connexion pour avoir:

Trusted_Connection=False;Persist Security Info=True

Basé sur cet article


Réponse populaire

Comme demandé, je poste mon commentaire comme réponse.

Ma solution était très similaire à celle de bizon où les informations de confiance et de sécurité persistantes nécessitaient une correction, mais je l'ai fait avec les propriétés de Visual Studio en allant dans:

Explorateur de serveurs -> Modifier la connexion -> Avancé -> Vérifiez ensuite que les informations de sécurité persistantes et le certificiel de serveur de certificats ont la valeur True et que la chaîne de connexion a correctement été formatée.

capture d'écran de visual studio gui



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow