在 Effort 中取消强制外键引用
Unenforce foreign key references in Effort
我正在使用 Visual Studio 中的 Effort 和 C# 来重新创建数据库并对其进行单元测试。我正在为单个 table 写一个 class,所以我只用来自 table 的对象填充数据库。我的问题是 Effort 数据库希望对象的外键引用数据库中的实际对象。
我的错误是
System.Data.Entity.Infrastructure.DbUpdateException: An error occurred while updating the entries. See the inner exception for details.
System.Data.Entity.Core.UpdateException: An error occurred while updating the entries. See the inner exception for details.
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation.
NMemory.Exceptions.ForeignKeyViolationException: Foreign key violation [Table1 :: SettingsId]. The key value [0] does not exists in the referenced table [Table2:: SettingsId].. Error code: RelationError
由于这个特定的 table 有许多外键指向具有许多其他外键的对象,因此需要大量工作。在 Effort 中有什么方法可以关闭它以便我可以单独测试这个 table?
table 并不孤单。如果您只需要 table,请设计一个新的 table 并使用 .sql 脚本删除约束和引用。使用 Entity Framework 时,模拟插入相对容易,但会变得非常激烈。
您可以从您的数据库创建一个新的 .edmx 文件,仅供测试使用。例如:
在Visual Studioselect文件->新建->数据->实体数据模型。
Select "EF Designer from database"。
选择或创建与现有 SQL 服务器数据库的连接,并将 app.config 中的连接设置保存为 "testConnectionString"。
在数据模型设计器中,删除不需要的任何外键关系。
保存设计器并重建项目。
在 Effort 中,将连接字符串的名称(在您创建新的 .edmx 时生成)传递给 CreateTransient
方法,如下所示:
EntityConnection connection = Effort.EntityConnectionFactory.CreateTransient("name=testConnectionString");
MyDbContext context = new MyDbContext(connection);
这应该允许您将值插入 table 而无需填充相关的外键 tables。
但是,这带有一个警告 - 如果您正在测试的代码使用任何依赖于外键的导航属性,它将失败。这让我想知道这种 "unit testing" 到底有多有价值。
我运行也遇到过这个问题,想在更大的数据库范围内测试table。您可以创建一个辅助方法,该方法将只实例化您需要的所有内容,并传递数据库或 table 作为结果的引用。这很有帮助,因为您可以在任何需要的测试中调用它 method/class,并且可以在任何需要的时候调用它。
我正在使用 Visual Studio 中的 Effort 和 C# 来重新创建数据库并对其进行单元测试。我正在为单个 table 写一个 class,所以我只用来自 table 的对象填充数据库。我的问题是 Effort 数据库希望对象的外键引用数据库中的实际对象。
我的错误是
System.Data.Entity.Infrastructure.DbUpdateException: An error occurred while updating the entries. See the inner exception for details.
System.Data.Entity.Core.UpdateException: An error occurred while updating the entries. See the inner exception for details.
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation.
NMemory.Exceptions.ForeignKeyViolationException: Foreign key violation [Table1 :: SettingsId]. The key value [0] does not exists in the referenced table [Table2:: SettingsId].. Error code: RelationError
由于这个特定的 table 有许多外键指向具有许多其他外键的对象,因此需要大量工作。在 Effort 中有什么方法可以关闭它以便我可以单独测试这个 table?
table 并不孤单。如果您只需要 table,请设计一个新的 table 并使用 .sql 脚本删除约束和引用。使用 Entity Framework 时,模拟插入相对容易,但会变得非常激烈。
您可以从您的数据库创建一个新的 .edmx 文件,仅供测试使用。例如:
在Visual Studioselect文件->新建->数据->实体数据模型。 Select "EF Designer from database"。 选择或创建与现有 SQL 服务器数据库的连接,并将 app.config 中的连接设置保存为 "testConnectionString"。
在数据模型设计器中,删除不需要的任何外键关系。 保存设计器并重建项目。
在 Effort 中,将连接字符串的名称(在您创建新的 .edmx 时生成)传递给 CreateTransient
方法,如下所示:
EntityConnection connection = Effort.EntityConnectionFactory.CreateTransient("name=testConnectionString");
MyDbContext context = new MyDbContext(connection);
这应该允许您将值插入 table 而无需填充相关的外键 tables。
但是,这带有一个警告 - 如果您正在测试的代码使用任何依赖于外键的导航属性,它将失败。这让我想知道这种 "unit testing" 到底有多有价值。
我运行也遇到过这个问题,想在更大的数据库范围内测试table。您可以创建一个辅助方法,该方法将只实例化您需要的所有内容,并传递数据库或 table 作为结果的引用。这很有帮助,因为您可以在任何需要的测试中调用它 method/class,并且可以在任何需要的时候调用它。