C# 无法在具有努力框架的单元测试中使用现有数据库

C# 无法在具有努力框架的单元测试中使用现有数据库,c#,entity-framework,unit-testing,entity-framework-6,effort,C#,Entity Framework,Unit Testing,Entity Framework 6,Effort,我正在尝试使用一个数据库编写测试,该数据库托管在Azure SQL中,框架位于实体框架6上 执行以下代码时,会引发异常: [ClassInitialize] public static void ClassInitialize(TestContext context) { EffortProviderConfiguration.RegisterProvider(); } [TestMethod] public void TestMethod1() { const string

我正在尝试使用一个数据库编写测试,该数据库托管在Azure SQL中,框架位于实体框架6上

执行以下代码时,会引发异常:

[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
时,它会成功,并且可以访问数据。此外,在不使用连接字符串的情况下,使用持久或瞬态模式创建上下文也很有效


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

您指定的连接字符串格式错误。无论何时,您都在使用ADO.NET/Linq2SQL连接字符串格式 EntityDataLoader需要适合EntityConnection(EntityFramework中的类)的连接字符串。 您可以在此处阅读EF的连接字符串:

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

"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' "

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

我认为您的连接字符串必须作为EF样式的连接字符串提供。例如在app.config或网络配置中:

<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);
}

[测试方法]
公共void MyTestMethod()
{
//安排
//然后,可以使用连接字符串的名称指定连接字符串:
实体连接=
EntityConnectionFactory.CreateTransient(“name=dbConnectionString”);
//表演
var-userscont;
使用(MyDbContext ctx=newmydbcontext(连接))
{
userscont=ctx.Users.Count();
}
//断言
//将断言逻辑放在这里:
Assert.IsTrue(userscont==100);
}

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

这也清楚地表明,自定义默认DbConnectionFactory方法只适用于代码优先,这解释了我最初几个小时所遇到的错误。。。对于model first或database first,必须向实体类中注入实体连接,如下所述


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

Hum如果使用“服务器”而不是“数据源”,会发生什么?就SQL Server而言,这是一个同义词,但可能Effort没有意识到……出于兴趣,当您从连接字符串中删除
数据源时会发生什么情况?您好,以上这些都没有帮助,当我将“数据源”键更改为“服务器”键时,它抱怨“服务器”键不支持关键字,如果我从连接字符串中删除数据源,它会不断抱怨连接字符串中的下一个键“Initial catalog”不受支持。另请参阅,它提供了有关仅提取连接字符串的元数据部分以便创建架构的更多详细信息。