utilizar try para manejo manejar errores como catch c# database entity-framework code-first ef-code-first

manejo - como utilizar el try catch para manejar errores en c#



El código EF4 primero causa la excepción InvalidOperationException (7)

Tengo un problema al intentar ejecutar mi proyecto cada vez que se genera. Parece que el inicializador se ejecuta, pero cuando se trata de la primera consulta, muere con la siguiente 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.

Para referencia, estoy usando el Código EF First CTP4, importado directamente con NuGet. Conectándose a un SQL Server 2008 R2

Lo que quiero que ocurra es volver a crear la base de datos si hay enmiendas al modelo y sembrarla con algunos valores para la tabla de búsqueda. Ambas cosas parecen estar soportadas * fuera de la caja.

Mi configuració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, muere en una línea similar a esta, que es básicamente la primera consulta que encuentra 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 creo que sean:

  • No son permisos : he eliminado la base de datos real en sí en el servidor SQL. La aplicación lo vuelve a crear aproximadamente al mismo tiempo que se intenta ejecutar la consulta (el inicializador se configura y, obviamente, no se crea hasta que sea necesario). También he iniciado 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 lo que esa cuenta crea también las bases de datos.
  • Se está creando la base de datos : eliminar la base de datos y se vuelve a crear automáticamente.
  • 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 ser un error en mi código / lógica, ya que una vez que la consulta ha fallado correctamente, el código se iniciará correctamente hasta la próxima vez que se reconstruya la aplicación . Obviamente, podría ser, y probablemente tendría que aplicar un trabajo en mi código sin importar lo que pase. :)

¿Qué hacer?

Idealmente, me gustaría "no pensar mucho en el esquema de la base de datos". Me gustaría que fuera como parecía en la excelente publicación de blog de Scott Gu (y seguimiento para trabajar con bases de datos existentes ) donde las cosas simplemente funcionaron y desaparecieron. 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 manera de rectificar este problema.

Unos pocos mensajes del foro / SO implican que el problema que tengo es básicamente porque los inicializadores no funcionan exactamente como se planificó y la conexión podría dejarse abierta. La solución en otros lugares parece ser simplemente "no crees tu propio inicializador", que no es la mejor solución, pero a menos que alguien tenga alguna idea, probablemente deba hacerlo hasta el CTP5.

* sí, ya sé que es un CTP, así que "compatible" probablemente no sea la palabra :)


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

Integrated Security=True;Persist Security Info=True;


No pude hacer que esto funcionara como quería. Esta respuesta es un cuerpo / opción de exclusión, así que tenga en cuenta al tomar su decisión sobre qué hacer.

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

Database.SetInitializer<CoreDB>(null);

Por supuesto, esto significa que debe mantener su base de datos cada vez que realice un cambio, o cambiarla para una única ejecución y luego volver a cambiarla después de crear la base de datos.


Nunca publicado antes, aprendiendo Entity Framework usando MVC, usando 2010 y un servidor de base de datos dev que ejecuta SQL Server 2005 para la base de datos. Soy principalmente un chico de aplicaciones de Windows.

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

Mi solución fue bastante brutal, entré en el servidor dev y entré en mi inicio de sesión y soy administrador del sistema en mi propio servidor, no es sorprendente. Así que entré en usermapping y seleccioné master y simplemente marqué cada casilla. Ahora funciona

No sé por qué ha funcionado esto o cuál es el problema, pero espero que alguien que sepa más que yo pueda aprovechar esta ''mala solución'' y mejorarla para otras personas que tienen este problema.


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

Trusted_Connection=False;Persist Security Info=True

Basado en este articulo


Según lo solicitado, estoy publicando mi comentario como respuesta.

Mi solución fue muy similar a bizon, donde Trusted_Connection y Persist Security Info necesitaban corrección, pero la logré a través de las propiedades de Visual Studio yendo a:

Server Explorer -> Modificar conexión -> Avanzado -> Luego verifique tanto la información de seguridad persistente como el certificado del servidor como verdadero, y formateó correctamente la cadena de conexión


Simplemente encuentre este problema mientras lo sigo en VS2012 y EF6. Mi solución es bastante simple:

En el cuadro de diálogo Propiedades de la conexión que aparece al seleccionar "Reverse Engineer Code First", marque "Guardar mi contraseña".

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


Tuve la contraseña incorrecta. Excepción extrañamente redactada