Pregunta

Estoy intentando implementar mi aplicación en un entorno de prueba, pero no puedo hacer que Entity Framework funcione bien con la base de datos. En desarrollo, utilizo un inicializador de base de datos para sembrar la base de datos y eso ha funcionado a la perfección. Sin embargo, cuando implemento la aplicación en una instancia de IIS real, no puedo hacer que se conecte con la base de datos. Mis reglas de inicialización personalizadas no se ejecutan en absoluto, por lo que estoy creando la base de datos manualmente.

Usé ObjectContext.CreateDatabaseScript () como punto de partida para mi script SQL, y SSMS verifica que dos filas estén pobladas en la tabla adecuada.

Mi problema surge después de ejecutar la aplicación. Tengo proveedores de roles y miembros personalizados, ninguno de los cuales parece detectar que los dos roles existen en la base de datos.

¿Cómo consigo que mi marco de entidad reconozca que estas filas no están vacías? Actualmente estoy usando un DbContext privado dentro de un repositorio para manejar la comunicación con Entity Framework y deshabilité mi inicializador personalizado hasta que se resuelva este problema.

Código que intenta encontrar roles en la base de datos:

context.Roles.Single(r => r.Name == role)

La base de datos muestra lo siguiente en la tabla Roles:

Id  Name     Description
1   Company  NULL
2   Customer NULL

El LINQ genera una excepción de secuencia vacía, ya que context.Roles está vacío.

¿Fue útil?

Solución 2

Estos son los pasos que seguí para migrar desde un proyecto de primer código con una implementación personalizada de IDatabaseInitializer que restablece la base de datos durante cada sesión a una configuración de base de datos no volátil.

Primero, copie el esquema generado por Entity Framework en su dev. proyecto ejecutando el siguiente código y colocando la salida en una ubicación accesible (es decir: archivo en el escritorio, texto sin formato en el navegador, etc.). context es una instancia de su clase que hereda de DbContext :

((IObjectContextAdapter)context).ObjectContext.CreateDatabaseScript()

En segundo lugar, guarde la cadena devuelta por esa llamada en un archivo SQL. Asegúrese de eliminar el comando que crea la tabla de metadatos de Entity Framework. Este comando debería parecerse al siguiente:

create table [dbo].[EdmMetadata] 
( 
    [Id] [int] not null identity, 
    [ModelHash] [nvarchar](max) null, 
    primary key ([Id]) 
);

A continuación, elimine el código que inicia la base de datos. Usé un AppSetting para poder alternar fácilmente el uso de ese código después de la implementación sin necesidad de volver a compilar e implementar.

if (ConfigurationManager.AppSettings["Mode"] == "Dev")
{
    Database.SetInitializer<PonosContext>(new PonosInitializer());
    new MyContext().Database.Initialize(true);
}

Inmediatamente fuera de esa declaración, aún necesita inicializar la base de datos, pero asegúrese de pasar falso para que la inicialización solo ocurra si la base de datos no se ha inicializado.

new MyContext().Database.Initialize(false);

Finalmente, ejecute su configuración SQL en una base de datos vacía para crear las tablas con los campos apropiados.

Si implementa y luego ejecuta su aplicación, debería conectarse a la base de datos y poder funcionar normalmente con cualquier dato que haya cargado en un script externo. Probé este método con éxito con miembros personalizados y proveedores de roles.

Otros consejos

A juzgar por los comentarios, parece que no hay conexión entre Entity Framework y la base de datos.No menciona qué versión de Entity Framework está utilizando, pero supongo que ha actualizado a la última (4.3 al momento de escribir este artículo).

Noto que dice que está "creando la base de datos manualmente".¿Por qué no abrir un proyecto de prueba y crear un primer modelo de base de datos nuevo basado en su base de datos creada manualmente?Esto debería al menos confirmar que puede usar Entity Framework con su configuración. A partir de ahí, crearía otro proyecto desde cero para probar el enfoque de Code First.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top