无法在使用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();
    }
}

Count()执行中抛出的异常:

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

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

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

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

热门答案

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

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

一个有用的提示 - 因为生成的实体模型类是一个部分类,你可以在同一个程序集中创建另一个代码文件,给它相同的命名空间,并使它也是一个部分类,你可以添加设置它所需的第二个构造函数相反,EntityConnection到该代码文件,当您修改/重新创建实体模型时,具有自定义构造函数的代码将不会被t4模板删除。





许可下: CC-BY-SA
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因