在Effort中强制使用外键引用

c# effort

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

我的错误是

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

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

System.Reflection.TargetInvocationException:调用目标抛出了异常。

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

由于此特定表具有许多具有许多其他外键的对象的外键,因此需要大量工作。有没有办法在努力将其关闭以便我可以单独测试这张桌子?

一般承认的答案

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


热门答案

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

在Visual Studio中,选择File-> New-> Data-> Entity DataModel。从数据库中选择“EF Designer”。选择或创建与现有SQL Server数据库的连接,并将app.config中的连接设置保存为“testConnectionString”。

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

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

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

MyDbContext context = new MyDbContext(connection);

这应该允许您将值插入表中,而无需填充相关的外键表。

但是,这会带来警告 - 如果您正在测试的代码使用依赖于外键的任何导航属性,则它将失败。这让我想知道这种“单元测试”到底有多么宝贵。




许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因