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

时间:2014-07-19 10:40:29

标签: c# entity-framework unit-testing 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();
    }
}

Count()执行中抛出异常:

  

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

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

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

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

3 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:3)

您正在以错误的格式指定连接字符串。您正在使用ADO.NET/Linq2SQL连接字符串格式 EntityDataLoader需要适合EntityConnection的连接字符串(来自EntityFramework的类)。 您可以在此处阅读有关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' "

现在,在您的代码中,您只指定了提供程序连接字符串部分。

答案 2 :(得分:1)

我相信您的连接字符串必须作为EF样式连接字符串提供。例如在app.config或webconfig中:

<add name="dbConnectionString" connectionString="metadata=res://*/Models.YourEntityModel.csdl|res://*/Models.YourEntityModel.ssdl|res://*/Models.YourEntityModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=yourdatasource;initial catalog=yourdb;persist security info=True;user id=username;password=password;multipleactiveresultsets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

[TestMethod]
public void MyTestMethod()
{
    //Arrange
    //Then you can specify your connection string with its name:
    EntityConnection connection =
    Effort.EntityConnectionFactory.CreateTransient("name=dbConnectionString");

    //Act
    var usersCount;
    using (MyDbContext ctx= new MyDbContext(connection))
    {
        usersCount = ctx.Users.Count();
    }
    //Assert
    //Put your assert logic here:
    Assert.IsTrue(usersCount == 100);
}