Tengo un problema al intentar ejecutar mi proyecto cada vez que se genera. Parece que se ejecuta el inicializador, pero cuando se trata de la primera consulta, muere con el siguiente InvalidOperationException
.Código EF4: la primera causa 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.
Como referencia, estoy utilizando el EF Code First CTP4, importado directamente con NuGet. Conexión a un servidor SQL 2008 R2
Lo que quiero pasar es volver a crear la base de datos si hay modificaciones del modelo y sembrarlo con algunos valores para la tabla de búsqueda. Ambas cosas parecen ser compatibles * de fábrica.
Mi disposición es así:
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));
}
}
Cuando se ejecuta, se muere en una línea similar a esta, que es básicamente la primera consulta que aparece después de crear la base de datos.
User data = (from u in _data.Users where u.Username == userName select u).SingleOrDefault();
Cosas que no me parece que es:
- No es permisos: He eliminado la base de datos en sí dentro del SQL Server. La aplicación la recrea más o menos al mismo tiempo que se intenta ejecutar la consulta (el inicializador está configurado, y obviamente impide la creación hasta que sea necesario). También inicié sesión en SQL Server como el usuario que se especifica en mi Web.config y tienen acceso completo de lectura/escritura a la base de datos. De hecho, probablemente deberían hacer como esa cuenta crea las bases de datos también.
- Se está creando la base de datos: eliminando la base de datos y recrea automáticamente bien.
- La cadena de conexión está correctamente definida, incluido el atributo
providerName
.
<add name="CoreDB" connectionString="Data Source=localhost\SQLEXPRESS;Initial Catalog=TheDatabase;User Id=TheUsername;Password=ThePassword;" providerName="System.Data.SqlClient" />
- No parece a un error en mi código/lógica, ya que una vez que la consulta no ha logrado con éxito, el código se iniciará correctamente hasta la próxima vez que la aplicación se reconstruye. Obviamente podría serlo, y probablemente tendría que aplicar un trabajo en mi código sin importar qué sea de todos modos. :)
¿Qué hacer?
Idealmente, me gustaría "no pensar demasiado en el esquema de la base de datos". Me gustaría que fuera como parecía estar en Scott Gu's excellent blog post (y seguir por working with existing databases) donde las cosas simplemente funcionaban y desaparecían. En su mayor parte, esto es cierto. Parece que hay un problema con la conexión que no se cierra en algún momento, pero no puedo encontrar la forma de solucionar este problema.
A few forum/SO posts implican que el problema que tengo es, básicamente, porque los inicializadores no funcionan exactamente como estaba previsto y la conexión puede quedar abierta. La solución en otros lugares parece ser simplemente "no crear su propio inicializador", que no es la mejor solución, pero a menos que alguien tenga alguna idea, probablemente tenga que hacerlo hasta CTP5 quizás.
* sí, sé que es un CTP, por lo que "apoyado" probablemente no es la palabra :)
Incluso me sale el error, pero al actualizar me puedo conectar a la base de datos – Novice
Te sugiero que reescribas el título de tu pregunta. Estoy bastante seguro de que EF4 no causa nada por sí mismo. –
Acabo de toparme con esto, pero estaba usando la selección de VS2012 y no parece haber un lugar para ingresar opciones adicionales desde la cadena de conexión. – tofutim