在Effort中如何取消外键引用的强制执行

7
我正在使用 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 中是否有关闭此功能的方法,以便我可以仅测试此表格?
3个回答

1
我也遇到了这个问题,并想在更大的数据库范围内测试表格。您可以创建一个辅助方法,它将实例化您需要的所有内容,并将数据库或带有引用的表格作为结果传递。这很有帮助,因为您可以从任何需要的测试方法/类中调用它,并且无论何时需要都可以调用它。

0

这个表并不孤单。如果你想要这个表独立,可以设计一个新的表,并使用 .sql 脚本删除约束和引用。当使用 Entity Framework 时,模拟插入操作相对容易,但可能会变得非常复杂。


0

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

在Visual Studio中选择 文件-> 新建-> 数据-> 实体数据模型。 选择“来自数据库的EF设计器”。 选择或创建到现有SQL Server数据库的连接,并将连接设置保存在app.config中作为“testConnectionString”。

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

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

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

MyDbContext context = new MyDbContext(connection);

这样可以让您插入表中的值,而无需填充相关的外键表。

但是请注意 - 如果您正在测试的代码使用了任何取决于外键的导航属性,它将失败。这使我想知道这种“单元测试”真正有多少价值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接