2010-12-01 13 views
28

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

+0

Incluso me sale el error, pero al actualizar me puedo conectar a la base de datos – Novice

+0

Te sugiero que reescribas el título de tu pregunta. Estoy bastante seguro de que EF4 no causa nada por sí mismo. –

+0

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

Respuesta

48

Sé que es demasiado tarde para responder, pero esta publicación es alta en Goolge y la respuesta puede ser útil para alguien. El problema es que falta credenciales. Para evitar esto es necesario cambiar la cadena de conexión para tener:

Trusted_Connection=False;Persist Security Info=True 

Basado en this article

+0

No puedo probar esto en este momento porque ya no tengo CTP4 configurado en mi máquina Dev. Pero le daré el voto favorable y responderé con la esperanza de que sea correcto para el de Google :) – Amadiere

+0

¡Ha funcionado para mí! ¡GRACIAS! – Stephane

+2

La actualización 1 de Entity Framework 4.1 contiene una corrección de errores para eliminar la necesidad de especificar 'Persist Security Info = True' en la cadena de conexión cuando se utiliza autenticación de SQL. http://www.microsoft.com/download/en/details.aspx?id=26825 –

0

he podido conseguir que esto funcione como quería. Esta respuesta es una bodge/opt-out, así que tenga cuidado al tomar una decisión sobre qué hacer.

Por mi parte, he retrocedido de Code-First hasta que esté en una versión más estable. Para cualquier persona que tenga este problema con el CTP4 también, puede evitarlo perdiendo su inicializador y pasando NULL en el método SetInitializer.

Database.SetInitializer<CoreDB>(null); 

Por supuesto, esto significa que usted necesita para mantener su base de datos cada vez que realice un cambio, o cambiarlo por una sola carrera y luego cambiarlo de nuevo después de que se crea la base de datos.

0

Nunca publicado antes, el aprendizaje de Entity Framework utilizando MVC, utilizando 2010 y un servidor de base de datos dev que ejecuta SQL Server 2005 para el base de datos. Soy principalmente un tipo de aplicación de Windows.

La primera parte del tutorial fue bien, creó las tres tablas hasta el momento, luego me encontré con el error anterior después de agregar algunas clases más y la estructura de la base de datos necesitaba cambiar.

Mi solución fue bastante brutal, fui al servidor de desarrollo y entre en mi nombre de usuario y soy administrador de mi propio servidor, lo cual no es sorprendente. Entonces entré en el mapeo de usuarios y seleccioné el máster y simplemente marqué cada casilla. Ahora funciona

No sé por qué esto ha funcionado o cuál es el problema, pero es de esperar que alguien que sabe más que yo pueda basarse en esta "mala solución" y mejorarla para otras personas que tengan este problema.

5

Acabo de encontrarme con este problema mientras sigo this en VS2012 y EF6. Mi solución es bastante simple:

En el cuadro de diálogo Propiedades de conexión que aparece al seleccionar "Código de ingeniero inverso primero", marque "Guardar mi contraseña".

Problema resuelto, pero no sé los detalles al respecto ...

+0

esto funcionó para mí, no sé por qué falla. Ya agregué las credenciales en la cadena de conexión – Sherlock

6

conforme a lo solicitado Estoy publicar mi comentario como respuesta.

Mi solución fue muy similar a Bizoń donde el Trusted_Connection y persistir Información de Seguridad necesita corrección, pero he logrado a través de las propiedades de Visual Studio a través de:

Explorador de servidores ->Modificar conexión ->avanzada -> A continuación, comprobar tanto Persist Security Info y trustServerCertificate como verdadero, y se formatea la cadena de conexión correctamente

screenshot of visual studio gui

+0

Esta es la respuesta correcta cuando se utiliza cualquiera de los complementos EF PowerTools o EF POCO. –

3

Agregue esto a su cadena de conexión. Funcionó para mí

Integrated Security=True;Persist Security Info=True; 
0

Tuve una contraseña incorrecta. Excepcion extrañamente redactada

Cuestiones relacionadas