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?
Si, como yo, está confundido sobre por qué debe darle a Effort una cadena de conexión (dado que funciona desde una base de datos en memoria y proporciona una conexión directa a su contexto), la documentación lo hace un poco más claro: es ¡solo se requiere si está utilizando variantes de base de datos primero o modelo primero de Entity Framework, porque la cadena de conexión de Entidad proporciona la información necesaria para que Esfuerzo ubique su modelo para que pueda construir un esquema a partir de él! Por lo tanto, puede llenar con seguridad las porciones de servidor / base de datos / identificación de usuario / contraseña de la cadena de conexión con nombres ficticios.
Esto también deja en claro que el enfoque DbConnectionFactory predeterminado personalizado solo funciona para el código primero, lo que explica las primeras horas de errores que recibí ... 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 ensamblado, asignarle el mismo espacio de nombres y convertirlo también en una clase parcial, y puede agregar el segundo constructor necesario para establecer el En cambio, EntityConnection a ese archivo de código, de esa manera cuando modifica / recrea su modelo de entidad, el código con el constructor personalizado no será eliminado por la plantilla t4.