No se puede utilizar la base de datos existente en pruebas unitarias con el marco de Esfuerzo


Pregunta

Estoy tratando de escribir la prueba utilizando una base de datos, alojada en Azure SQL, con el marco de Esfuerzo en Entity Framework 6.

Al ejecutar el siguiente código, se lanza una excepción:

[ClassInitialize]
public static void ClassInitialize(TestContext context)
{
    EffortProviderConfiguration.RegisterProvider();
}

[TestMethod]
public void TestMethod1()
{
    const string connectionString = "Data Source=***;Initial Catalog=my_catalog;User ID=user;Password=password;provider=System.Data.SqlClient";
    IDataLoader loader = new EntityDataLoader(connectionString);
    using (var ctx = new UsersDbContext(Effort.DbConnectionFactory.CreatePersistent("cool", loader)))
    {
        var usersCount = ctx.Users.Count();
    }
}

Excepción lanzada en la ejecución de Count() :

Effort.Exceptions.EffortException: excepción no controlada al intentar inicializar el contenido de la tabla 'Tabla' ---> System.ArgumentException: palabra clave no admitida: 'fuente de datos'.

Se produce la misma excepción cuando se reemplaza EffortProviderConfiguration.RegisterProvider() con la configuración de app.config.

Cuando se utiliza exactamente la misma cadena de conexión para la creación de UsersDbContext se realiza correctamente y se puede acceder a los datos. Además, la creación de contexto con el modo de esfuerzo persistente o transitorio, sin cadena de conexión, también funciona bien.

¿Qué se debe hacer para inicializar una conexión con datos existentes desde una base de datos real?

Respuesta popular

Si, como yo, no está seguro de por qué debe darle a Effort una cadena de conexión (ya que funciona con una base de datos en memoria y le proporciona una conexión a su contexto directamente), la documentación lo hace un poco más claro: es solo es necesario si está usando variantes de base de datos primero o modelo primero del Entity Framework, porque la cadena de conexión Entidad proporciona la información necesaria para que Effort ubique su modelo de modo que pueda construir un esquema a partir de él. Por lo tanto, puede rellenar de forma segura las partes del servidor / base de datos / id de usuario / contraseña de la cadena de conexión con nombres ficticios.

Esto también deja en claro que el enfoque predeterminado personalizado de DbConnectionFactory solo funciona con el código primero, lo que explica las primeras horas de errores que recibía ... Para el modelo primero o la base de datos primero, debe inyectar una conexión de entidad en su clase de entidad , como se describe aquí .

Un consejo útil: debido a que su clase de modelo de entidad generada es una clase parcial, puede crear otro archivo de código en el mismo ensamblaje, asignarle el mismo espacio de nombres y convertirlo también en una clase parcial, y puede agregar el segundo constructor necesario para configurar el EntityConnection a ese archivo de código en su lugar, de esa manera, cuando modifique / vuelva a crear su modelo de entidad, el código con el constructor personalizado no se eliminará con la plantilla t4.





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