代码之家  ›  专栏  ›  技术社区  ›  Intellectual Gymnastics Lover

如何释放跟踪的实体?

  •  0
  • Intellectual Gymnastics Lover  · 技术社区  · 5 年前

    希望下面的代码片段足够清楚地解释这个问题。 _db DbContext .

    // this scenario is only for learning purpose
    Author a = _db.Authors.Find(1831);
    int id = a.AuthorId;
    a = null;
    
    Author stub = new Author { AuthorId = id };
    _db.Remove(stub);
    _db.SaveChanges();
    

    上面的代码生成

    '无法跟踪实体类型'Author'的实例,因为已在跟踪另一个具有{'authord'}相同键值的实例。附着现有实体时,请确保仅附着一个具有给定键值的实体实例。考虑使用“DbC”ontextOptionsBuilder.EnableSensitiveDataLogging'以查看冲突的键值。'

    如何释放 a 不被跟踪?

    0 回复  |  直到 5 年前
        1
  •  3
  •   Zer0    5 年前

    有多种方法可以做到这一点,但我发现这是最简单的,因为您正在尝试分离一个特定的实体。

    _db.Entry(a).State = EntityState.Detached
    

    另外,它不需要更改任何其他代码,包括如何获取实体本身。

    这一行非常清楚地表明了意图。它还允许以下操作:

    1. 做各种各样的工作
    2. 拆离实体

    我不喜欢在服务器上更改现有查询的想法 DbContext 当我只想拆开一些东西的时候。

        2
  •  2
  •   Ben Phung    5 年前

    你可以试试 AsNoTracking()
    _db.Authors.AsNoTracking数据库()。其中(a=>a.AuthorId==1831).FirstOrDefault();

        3
  •  2
  •   Manoj Choudhari    5 年前

    你应该使用 AsNoTracking 查询时的选项。

    e、 下面的查询获取所有的博客项目,但如果你试图删除它们,你应该不会得到任何错误。

    var blogs = context.Blogs
            .AsNoTracking()
            .ToList();
    

    阿斯诺跟踪 可以在查询上设置,也可以在上下文对象上设置,如下所示:

    context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
    
    var blogs = context.Blogs.ToList();
    

    这应该有助于你解决这个问题。

    参考 this MSDN page 更多细节。