无法在使用Effort框架的单元测试中使用现有数据库

Len*_*lan 12 c# unit-testing entity-framework entity-framework-6 effort

我正在尝试使用Azure SQL中托管的数据库和Entity Framework 6上的Effort框架编写测试.

执行以下代码时,抛出异常:

[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();
    }
}
Run Code Online (Sandbox Code Playgroud)

Count()执行中抛出异常:

Effort.Exceptions.EffortException:尝试初始化'Table'表的内容时出现未处理的异常---> System.ArgumentException:不支持关键字:'data source'.

EffortProviderConfiguration.RegisterProvider()使用app.config设置替换时会抛出相同的异常.

当使用完全相同的连接字符串创建UsersDbContext它时,它成功并且可以访问数据.此外,使用Effort持久或临时模式创建上下文,没有连接字符串,也可以很好地工作.

如何使用真实数据库中的现有数据初始化连接?

Bre*_*eno 5

如果像我一样,您对于为什么必须给Effort一个连接字符串感到困惑(因为它可以在内存数据库中工作,并且您直接为您的上下文提供了连接),文档使它更加清晰-仅在使用Entity Framework的数据库优先或模型优先变体时才需要,因为Entity连接字符串提供了Effort定位模型所需的信息,以便可以从中构建模式!因此,您可以安全地用虚拟名称填充连接字符串的服务器/数据库/用户标识/密码部分。

这也清楚表明,自定义默认DbConnectionFactory方法仅适用于代码优先,这说明了我遇到的最初几个小时的错误...对于模型优先或数据库优先,必须将实体连接注入到实体类中,如所描述这里

一个有用的技巧-因为生成的实体模型类是局部类,所以您可以在同一程序集中创建另一个代码文件,为其提供相同的名称空间,并使它也成为局部类,并且可以添加第二个构造函数来设置而是与该代码文件建立EntityConnection,这样,当您修改/重新创建实体模型时,带有自定义构造函数的代码将不会被t4模板删除。


Ale*_*tov 3

您指定的连接字符串格式错误。每当 EntityDataLoader 需要适合 EntityConnection(EntityFramework 中的类)的连接字符串时,您就会使用 ADO.NET/Linq2SQL 连接字符串格式。您可以在此处阅读有关 EF 连接字符串的信息:http://msdn.microsoft.com/en-us/library/system.data.entityclient.entityconnection.connectionstring( v=vs.110).aspx

简而言之,您的连接字符串应如下所示:

"Provider=System.Data.SqlClient; 
 Metadata=c:\metadata|c:\Metadata\Sql; 
 Provider Connection String='Data Source=localhost; Initial Catalog=AdventureWorks;Integrated Security=True;Connection Timeout=60' "
Run Code Online (Sandbox Code Playgroud)

现在,在您的代码中,您仅指定提供者连接字符串部分。