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 :)