我正在尝试使用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一个连接字符串感到困惑(因为它可以在内存数据库中工作,并且您直接为您的上下文提供了连接), 文档使它更加清晰-仅在使用Entity Framework的数据库优先或模型优先变体时才需要,因为Entity连接字符串提供了Effort定位模型所需的信息,以便可以从中构建模式!因此,您可以安全地用虚拟名称填充连接字符串的服务器/数据库/用户标识/密码部分。
这也清楚表明,自定义默认DbConnectionFactory方法仅适用于代码优先,这说明了我遇到的最初几个小时的错误...对于模型优先或数据库优先,必须将实体连接注入到实体类中,如所描述这里 。
一个有用的技巧-因为生成的实体模型类是局部类,所以您可以在同一程序集中创建另一个代码文件,为其提供相同的名称空间,并使它也成为局部类,并且可以添加第二个构造函数来设置而是与该代码文件建立EntityConnection,这样,当您修改/重新创建实体模型时,带有自定义构造函数的代码将不会被t4模板删除。