我在.Net core 2.0应用程序中创建的单元测试项目中使用了以下Nuget软件包。
我已经创建了一个用于单元测试的InMemory数据库。
每当我执行包含Update操作的单元测试用例时,都会出现异常
“无法跟踪实体类型'tablename'的实例,因为已经跟踪了另一个具有相同{Id}的键值的实例。附加现有实体时,请确保仅附加一次具有给定键值的实体实例“。
这是由于包含FindByAsync
方法的AsNoTracking()
方法引起的。
方法如下图所示。
public virtual FindByAsync()
{
Query= Query.AsNoTracking().AsExpandable.().Where(predicate);
}
当我评论此AsNoTracking()
函数时。单元测试用例成功。
任何有助于我成功执行失败的测试用例的想法,建议或解决方法。
答案 0 :(得分:0)
跟踪行为控制Entity Framework Core是否将有关实体实例的信息保留在其更改跟踪器中。如果跟踪了一个实体,则在SaveChanges()期间,该实体中检测到的任何更改都将保留到数据库中。
跟踪查询
using (var context = new BloggingContext())
{
var blog = context.Blogs.SingleOrDefault(b => b.BlogId == 1);
blog.Rating = 5;
context.SaveChanges();
}
无跟踪查询
using (var context = new BloggingContext())
{
var blogs = context.Blogs
.AsNoTracking()
.ToList();
}
如果修改了实体实例,则更改跟踪器将不会检测到该实例,并且SaveChanges()不会将这些更改持久保存到数据库中。
如果您在代码中遵循此规则,则不会遇到问题。