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 .
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í:
public DatabaseEntities(DbConnection connection)
: base(connection, true) { }
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.
OnModelCreating()
anulado. DbContext
mi DbContext
con Moq , que definitivamente no es una opción. ¿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:
DbConnection effortConnection = Effort.DbConnectionFactory.CreatePersistent("MockedDatabaseEntities");
using (DatabaseEntities dataContext = new DatabaseEntities(effortConnection))
{
dataContext.Students.Count(); // Exception throws here
}
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. '
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 !