UnintentionalCodeFirstException | Entity Framework Unit Testing with Effort.Ef6 using Database First

c# effort entity-framework entity-framework-6 unit-testing

Pregunta

La situación

Quiero habilitar la prueba unitaria de mi DbContext basado en el marco de la entidad 6. He creado mi DbContext y mis modelos con el primer enfoque de la base de datos y ahora tengo un archivo de diseñador .edmx .

El problema

Mi DbContext creado automáticamente anula el método DbContext.OnModelCreating esta manera:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    throw new UnintentionalCodeFirstException();
}

Estoy tratando de crear una nueva instancia de mi DbContext en mi servicio de acceso de datos DbContext basado en la información de este artículo . Mi código no se ejecuta en Database.SetInitializer; Como ha señalado el autor de este blog. Mi constructor se ve exactamente como el suyo. Mi inicialización DbContext ve así:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    throw new UnintentionalCodeFirstException();
}

Lo que resulta en la siguiente excepción al alcanzar el OnModelCreating anulado anteriormente mencionado

System.Data.Entity.Infrastructure.UnintentionalCodeFirstException: 'El contexto se usa en el modo Code First con el código generado desde un archivo EDMX para el desarrollo de Database First o Model First. Esto no funcionará correctamente. Para solucionar este problema, no elimine la línea de código que produce esta excepción. Si desea usar Database First o Model First, asegúrese de que la cadena de conexión de Entity Framework esté incluida en app.config o web.config del proyecto de inicio. Si está creando su propia DbConnection, asegúrese de que se trata de una EntityConnection y no de algún otro tipo de DbConnection, y de que lo pase a uno de los constructores de DbContext base que tome una DbConnection. Para obtener más información sobre Code First, Database First y Model First, consulte la documentación de Entity Framework aquí: http://go.microsoft.com/fwlink/?LinkId=394715 '

Hay un montón de preguntas sobre stackoverflow que se centran en pruebas de unidad con esfuerzo al usar el apporach de base de datos primero, pero nadie parece tener problemas similares como yo.

Lo que ya he tratado de hacer

  • Buscando en internet mucho tiempo por una solución.
  • Descomente el OnModelCreating() anulado.
  • Ya he intentado aplicar esta solución sin éxito.
  • DbContext mi DbContext con Moq , que definitivamente no es una opción.

La pregunta

¿Cómo puedo crear y usar una base de datos en memoria (con esfuerzo)?


Información Adicional

Cuando OnModelCreating() el comentario de OnModelCreating() , se lanzará una excepción en el primer acceso al DataContext. P.ej:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    throw new UnintentionalCodeFirstException();
}

System.Data.Entity.ModelConfiguration.ModelValidationException: 'Se detectaron uno o más errores de validación durante la generación del modelo: MyApplication.Shared.Model.KeyValuePair:: EntityType' KeyValuePair 'no tiene una clave definida. Define la clave para este tipo de entidad. KeyValuePairs: EntityType: EntitySet 'KeyValuePairs' se basa en el tipo 'KeyValuePair' que no tiene claves definidas. '

Respuesta aceptada

El problema fue que tuve que especificar la clave para mi conjunto de datos KeyValuePair.

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<KeyValuePair>().HasKey(x => x.Key);
    base.OnModelCreating(modelBuilder, null);
}

Muchas gracias Robert Jürgensgaard Engdahl !




Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué