在Effort中强制使用外键引用

本文关键字:引用 Effort | 更新日期: 2023-09-27 17:57:59

我正在Visual Studio和C#中使用Effort来重新创建数据库并对其进行单元测试。我正在为一个表编写一个类,因此我只使用该表中的对象填充数据库。我的问题是Effort数据库希望对象的外键引用数据库中的实际对象。

我的错误是

System.Data.Entity.Infrastructure.DbUpdateException:更新条目时出错。有关详细信息,请参阅内部异常。

System.Data.Entity.Core.UpdateException:更新条目时出错。有关详细信息,请参阅内部异常。

System.Reflection.TargetInvocationException:调用的目标引发了异常。

NMemory.Exceptions.ForeignKeyViolationException:外键冲突[Table1::SettingsId]。键值[0]在引用的表[Table2::SettingsId]中不存在。。错误代码:RelationError

由于这个特定的表有许多外键,而对象有许多其他外键,这将需要大量的工作。Effort有没有办法关闭它,这样我就可以单独测试这个表了?

在Effort中强制使用外键引用

我也遇到了这个问题,希望在更大的数据库范围内测试表。您可以创建一个helper方法,该方法将实例化所需的所有内容,并通过引用传递数据库或表。这很有帮助,因为您可以从任何需要的测试方法/类调用它,也可以在任何需要的时候调用它

表并不是唯一的。如果只想使用该表,请设计一个新表,并使用.sql脚本删除约束和引用。当使用实体框架时,模拟插入相对容易,但这可能会变得非常激烈。

您可以从数据库中创建一个新的.edmx文件,仅供测试使用。例如:

在Visual Studio中,选择"文件"->"新建"->"数据"->"实体数据模型"。选择"EF Designer from database"。选择或创建与现有SQL Server数据库的连接,并将app.config中的连接设置保存为"testConnectionString"。

在数据模型设计器中,删除任何不需要的外键关系。保存设计器并重新生成项目。

在Effort中,将连接字符串的名称(在创建新的.edmx时生成)传递给CreateTransient方法,如下所示:

EntityConnection connection = Effort.EntityConnectionFactory.CreateTransient("name=testConnectionString");
MyDbContext context = new MyDbContext(connection);

这应该允许您在不需要填充相关外键表的情况下将值插入到表中。

不过,这会带来一个警告——如果您正在测试的代码使用了任何依赖于外键的导航属性,那么它将失败。这让我想知道这种"单元测试"到底有多大价值