我在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中关闭它以便我可以单独测试这个表?
答案 0 :(得分:1)
我也遇到了这个问题,并希望在更大的数据库范围内测试该表。您可以创建一个辅助方法,它只是实例化您需要的所有内容,并将结果传递给数据库或表。这有帮助,因为您可以根据需要随时随地调用它。
答案 1 :(得分:0)
桌子并不孤单。如果您只想要表,请设计一个新表并使用.sql脚本删除约束和引用。使用Entity Framework时,模拟插入相对容易,但这可能会非常激烈。
答案 2 :(得分:0)
您可以从数据库中创建一个新的.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);
这应该允许您在表中插入值而无需填充相关的外键表。
但是这会带来警告 - 如果您正在测试的代码使用依赖于外键的任何导航属性,它将失败。这让我想知道这种“单元测试”真的有多么宝贵。