visual studio instalador incluir generate embebida datos conexion con aplicacion c# asp.net-mvc entity-framework entity-framework-4 ef-code-first

c# - studio - Excepción cuando el código primero intentó crear una base de datos



incluir base de datos en instalador c# (7)

He creado una nueva aplicación ASP.NET MVC 4 y me gustaría usar el código primero. Sin embargo, no parece crear inicialmente el archivo de base de datos si aún no existe. Si elimino el archivo .mdf de la carpeta App_Data, obtengo la siguiente excepción cuando la aplicación intente acceder a la base de datos:

System.Data.SqlClient.SqlException: Cannot attach the file ''<path-to-db-file>.mdf'' as database ''<my-db-file-name>''.

Si lo ejecuto en la aplicación en el depurador, entonces puedo ver que la excepción está ocurriendo en el método InitializeSimpleMembershipAttribute :: OnActionExecuting cuando se llama a LazyInitializer.EnsureInitialized. La excepción capturada es:

[System.Reflection.TargetInvocationException] {"Exception has been thrown by the target of an invocation."} System.Reflection.TargetInvocationException

Con una excepción interna de:

[System.InvalidOperationException] {"The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588"} System.InvalidOperationException

Que luego tiene la primera excepción que mencioné anteriormente como la excepción interna de eso.

¿Alguna idea de lo que estoy haciendo mal?

Actualizar

Acabo de probarlo con una nueva aplicación MVC4. Puedo replicarlo haciendo lo siguiente:

  1. Crea la aplicación MVC en el asistente de VS.
  2. Ejecute la aplicación por primera vez y vaya a la página de inicio de sesión (tenga en cuenta que ahora se genera el archivo mdf).
  3. Borre el archivo mdf y vuelva a la página de inicio de sesión. Ahora se lanza la excepción.

Debe detener su instancia de IISExpress y reiniciarla nuevamente (presionando F5 en su Visual Studio). Entonces podrás crear la base de datos de nuevo.


El código generado por MVC funciona con una cadena de conexión de base de datos llamada "DefaultConnection". Si usó un nombre diferente en Web.config, necesita referirse a este nombre en:

  1. InitializeSimpleMembershipAttribute.SimpleMembershipInitializer.ctor () en InitializeSimpleMembershipAttribute.cs).
  2. UsersContext.ctor () en AccountModel.cs

(o simplemente busque "DefaultConnection" en su proyecto).


Lo que me lo arregló cuando recibí este error es que cambié la cadena de conexión en el archivo App.config de mi Proyecto VS.

He añadido esto en la cadena de conexión:

<connectionStrings> <add name="Blog" connectionString="Data Source=(LocalDb)/MSSQLLocalDB;Integrated Security=true;AttachDbFileName=C:/Users/kostadin/Database1.mdf" providerName="System.Data.SqlClient" />

Espero que esto ayude a alguien más.


Me metí en el mismo problema y encontré mi solución here . todo lo que tiene que hacer es detener LocalDb abriendo el indicador de comando del desarrollador de VS e ingresando (sin comillas):

"sqllocaldb.exe stop v11.0"

"sqllocaldb.exe delete v11.0"

La próxima vez, EF volverá a generar el archivo y la base de datos.


Nunca debe eliminar los archivos .mdf creados automáticamente en Explorer, solo a través de las herramientas de administración de SQL o en el Explorador de objetos.

El problema que está obteniendo (y se puede replicar en los pasos que ha proporcionado) es que la base de datos todavía está registrada en LocalDb.


Puede manejar la inicialización de la base de datos de Code First en el método Application_Start del archivo Global.asax en la carpeta raíz de su proyecto, como lo siguiente:

protected void Application_Start() { Database.SetInitializer<MyDBContext>(null); }

Si pasa nulo a SetInitializer, no creará ni alterará las tablas de su base de datos, debe hacerlo manualmente.

La razón por la que la base de datos no se vuelve a generar es que Application_Start se inicia solo una vez durante el tiempo de vida de la aplicación.


Si profundiza en la clase InitializeSimpleMembershipAttribute de su aplicación, verá el siguiente método anulado de la clase ActionFilterAttribute de la que hereda:

public override void OnActionExecuting(ActionExecutingContext filterContext) { // Ensure ASP.NET Simple Membership is initialized only once per app start LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock); }

Note ese comentario. La aplicación está comprobando una vez por ejecución para garantizar que la membresía simple se haya inicializado correctamente. Mira las variables privadas en la parte superior de la clase:

private static SimpleMembershipInitializer _initializer; private static object _initializerLock = new object(); private static bool _isInitialized;

Todos son estáticos y todos se pasan como referencias. El importante aquí para su situación es _isInitialized . Lo que LazyInitializer.EnsureInitialized hace es verificar el indicador _isInitialized y si es falso, inicializa el objetivo de referencia que se pasó, en este caso, el _initializer de tipo SimpleMembershipInitializer . En ese punto, establece la bandera en verdadero y continúa. Si LazyInitializer.EnsureInitialized ve que el indicador es verdadero, no hace nada más que devolver el objetivo. Dado que ese indicador es una variable estática, persiste su valor durante la vida útil de la aplicación, lo que significa que después de esa primera inicialización, InsuranceInitialized siempre devolverá el destino incluso si el archivo de la base de datos ya no existe. En otras palabras, si elimina el archivo .mdf después de la inicialización, la aplicación no lo sabrá y se producirán excepciones cuando la aplicación intente leer o escribir desde la base de datos. Para resolver esto, debes reiniciar la aplicación, lo que significa eliminar el servidor dev si eso es lo que estás utilizando o reiniciar la aplicación en IIS.

Ese es el problema al que te enfrentas, pero sospecho que muchas de las personas que se encuentran con esta pregunta tienen un problema similar pero diferente en el que reciben un mensaje de error similar a este cuando intentan iniciar sesión:

CREATE FILE encontró el error 5 del sistema operativo (Acceso denegado) al intentar abrir o crear el archivo físico ''C: / path / to / your / project / App_Data / dbfile.mdf''. CREATE DATABASE falló. Algunos de los nombres de archivos en la lista no se pudieron crear. Compruebe los errores relacionados.

Esto es muy fácil de resolver, lo cubriré rápidamente aquí también.

Por defecto, Visual Studio 2012 usa una versión reducida de SQL Server Express llamada LocalDB. LocalDB activará un proceso secundario de la aplicación, y si está ejecutando su aplicación en el servidor de desarrollo de Visual Studio (por ejemplo, http: // localhost: [puerto] aparece en su navegador), entonces está ejecutando la aplicación. y LocalDB bajo su cuenta de usuario, no bajo SYSTEM o NETWORKSERVICE. Todo lo que tiene que hacer para solucionar este problema es asignar permisos de modificación a su usuario para la carpeta App_Data de su proyecto. Intente iniciar sesión nuevamente y el archivo .mdf debe crearse correctamente.

Si tienes curiosidad, puedes aprender más sobre LocalDB here.