7

我在 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

由于这个特定的表有很多外键,对象有很多其他外键,所以需要做很多工作。Effort 有什么办法可以关闭它,以便我可以单独测试这张表?

4

3 回答 3

1

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

于 2016-08-08T18:29:31.937 回答
0

这张桌子并不孤单。如果您只需要该表,请设计一个新表并使用 .sql 脚本删除约束和引用。使用 Entity Framework 时,模拟插入相对容易,但会变得非常激烈。

于 2016-08-05T19:01:49.173 回答
0

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

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

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

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

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

MyDbContext context = new MyDbContext(connection);

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

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

于 2016-08-08T10:58:32.197 回答