5

He usado EF 4.1 (Code First) hace un tiempo en un proyecto MVC 3, y estuvo bien.Entity Framework 4.3.1 falla al crear (/ abrir) una base de datos [Anomalía de subprocesos?]

Hoy he intentado usar EF 4.3.1 (Código Primera) en un proyecto de Windows Forms y se encontró con algunos vudú real: (El proyecto original que estaba trabajando era WinForms, sin embargo lo mismo es cierto para el unidos Código de aplicación de consola.)

Al intentar introducir una clase simple en la base de datos, recibo la siguiente excepción: No se puede abrir la base de datos "Test" solicitada por el inicio de sesión. El inicio de sesión falló. Falló el inicio de sesión para el usuario '[ComputerName] \ [Administrator]'.

He intentado verificar las configuraciones de SQL Server (2008 R2) pero mi usuario tiene tiene todos los permisos en el servidor.

NOTA: La base de datos hace no existen la primera vez que ejecute la aplicación.

Incluso el siguiente ejemplo de código no funciona:

class Program 
{ 
    public static void Main() 
    { 
     var person = new Person { Name = "Nathan" }; 
     using (var db = new MyContext()) 
     { //#1 
      db.Persons.Add(person); 
      db.SaveChanges(); 
     } 
     Console.Write("Person saved !"); 
     Console.ReadLine(); 
    } 
} 

public class Person 
{ 
    public int PersonId { get; set; } 
    public string Name { get; set; } 
} 

public class MyContext : DbContext 
{ 
    public DbSet<Person> Persons { get; set; } 
    public MyContext() 
     : base("Data Source=localhost;Database=Test;Integrated Security=True;") 
    { } 
} 

He intentado volver a instalar EF 4.3.1 - en vano. Reiniciar el servidor SQL tampoco tuvo ningún efecto.

NOTA: Me he dado cuenta de un buen montón de preguntas similares en todo, pero ninguno es tanto la misma que la mía y respondí - aquí está la esperanza de que me tenga suerte aquí :)

Para aclarar: El usuario al que se le niega el acceso es el propietario (administrador local) de la máquina.

EDIT: He estado corriendo un par de experimentos y he encontrado algo muy extraño:

Si hago una pausa el programa en la línea marcada "# 1" y comprobar el valor de db. Database.Exists() a través de la ventana dereloj, me dice: "la evaluación de la función requiere que todos los hilos para funcionar" con esa pequeña Ondulado botón me puede hacer clic para que funcione en todos los temas. Image depicting the above paragraph

Si hago clic en ese botón de la función se evalúa como Falso .

ahora que puedo hacer cosas:

  1. continuar la ejecución: En este caso me sale exactamente la misma excepción.
  2. Ejecute db.Database.Create() desde la ventana Watch: en este caso, el programa se ejecuta satisfactoriamente hasta el final y veo la base de datos, la tabla y la fila creadas en mi SQL Management Studio.

Parece una solución simple, ¿no? ¡Incorrecto!

He intentado prefijar el acceso a los datos con una llamada al db.Database.CreateIfNotExists(); pero luego obtengo el exactamente la misma excepción en esa línea.

db.Database.Initialize (true); no tiene ningún efecto, ya sea ...

NOTA: Si utilizando el método anterior se crea la base de datos, puedo utilizarlo correctamente partir de ese momento, así que eso es al menos la mitad de un consuelo: P El problema es, por supuesto, lo que sucede cuando agrego un DropCreateIfModelChanges o DropCreateAlways Initalizer (ya que estoy en el medio del desarrollo activo del modelo).

Gracias.

[Estoy sospechando que es más bien un problema de Entity Framework de SQL Server.]

+0

¿Puede conectarse a la base de datos utilizando sus credenciales sin EF (por ejemplo, desde Visual Studio o Sql Server Management Studio)? – Pawel

+0

Sí, utilizando Management Studio puedo hacer lo que quiera en la base de datos, incluida la creación de bases de datos, tablas, actualización de filas, etc. –

+0

¿Utiliza seguridad integrada? – Pawel

Respuesta

14

Se puede ver esta excepción al depurar si le sucede que tiene "romperse cuando se lanza una excepción" opción (de Depuración> Excptions) encendido. EF intenta conectarse a la base de datos pero falla, ya que la base de datos aún no existe, por lo que se lanza una excepción. Verá la excepción debido a la opción anterior activada. Esta excepción es captada por Entity Framework y EF se conectará a la base de datos maestra para crear la base de datos que estaba tratando de conectar en el primer paso. Una vez que se crea la base de datos, nuevamente usará la cadena de conexión original para hablar con la base de datos. Entonces, puede presionar F5 para continuar con la depuración ya que la excepción es una excepción de primera oportunidad que se manejará o deshabilitará para desactivar "interrumpir cuando se lanza una excepción", lo que dará como resultado la ruptura solo para excepciones que no se manejan en lugar de son arrojados.

+0

¡Eso es genial! Permití el corte debido a un error que tenía e intentaba encontrar, pero me olvidé de apagarlo. ¡Gracias! –

+0

¡Mi hombre! Básicamente, cambié mi modelo, lo que provocó que se lanzara una excepción legítima, se activara para el tipo SqlException y aunque el modelo no se creara aún ... Todo lo que tuve que hacer fue interrumpir nuevamente esa excepción y creará el modelo después de tirarlo un par de veces ... –

Cuestiones relacionadas