在不使用AsNoTracking()的情况下执行查找/更新Xunit测试用例

时间:2019-02-21 08:09:34

标签: c# asp.net-mvc entity-framework .net-core

我在.Net core 2.0应用程序中创建的单元测试项目中使用了以下Nuget软件包。

enter image description here

我已经创建了一个用于单元测试的InMemory数据库。

每当我执行包含Update操作的单元测试用例时,都会出现异常

  

“无法跟踪实体类型'tablename'的实例,因为已经跟踪了另一个具有相同{Id}的键值的实例。附加现有实体时,请确保仅附加一次具有给定键值的实体实例“。

这是由于包含FindByAsync方法的AsNoTracking()方法引起的。 方法如下图所示。

public virtual FindByAsync()
{
     Query= Query.AsNoTracking().AsExpandable.().Where(predicate);
}

当我评论此AsNoTracking()函数时。单元测试用例成功。

任何有助于我成功执行失败的测试用例的想法,建议或解决方法。

1 个答案:

答案 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()不会将这些更改持久保存到数据库中。

More info

如果您在代码中遵循此规则,则不会遇到问题。