gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:25:56 24 4
gpt4 key购买 nike

我正在尝试使用托管在 Azure SQL 中的数据库编写测试,Effort Entity Framework 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: Unhandled exception while trying to initialize the content of 'Table' table ---> System.ArgumentException: Keyword not supported: 'data source'.

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

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

应该如何初始化与真实数据库中现有数据的连接?

最佳答案

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

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

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

关于c# - 无法使用 Effort 框架在单元测试中使用现有数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24839456/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com