13

我正在尝试使用托管在 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:尝试初始化“表”表的内容时出现未处理的异常---> System.ArgumentException:不支持关键字:“数据源”。

EffortProviderConfiguration.RegisterProvider()替换为 app.config 设置时会引发相同的异常。

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

应该做些什么来初始化与真实数据库中现有数据的连接?

4

3 回答 3

6

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

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

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

于 2016-11-17T21:10:25.100 回答
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' "

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

于 2014-07-22T19:17:52.630 回答
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);
}
于 2014-07-22T19:19:29.430 回答