EF核心无跟踪和Add()或Update()

时间:2020-04-19 18:14:02

标签: c# entity-framework dbcontext ef-core-3.1

我正在尝试使我的DbContext正常运行而无需跟踪。

public class MyContext: DbContext
{
    public MyContext() 
    {
        ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
    }
    ...
}

此外,在每个Add(..)或Update(..)之后,我都会删除对新实体的跟踪:

_context.Users.Add(user);
await _context.SaveChangesAsync();
_context.Entry(user).State = EntityState.Detached;

如果我添加(或更新)对现有实体(意味着已经存储在数据库中)的引用的新实体,则会出现问题。

例如:

var section = new Section();
_context.Sections.Add(section);
await _context.SaveChangesAsync();
_context.Entry(section).State = EntityState.Detached;

...

var user = new User
{
   Name = "Alex",
   Section = section
}

_context.Users.Add(user);
await _context.SaveChangesAsync();

导致错误:

System.ArgumentException:'已添加具有相同键的项。密钥:1'

我该如何解决?

2 个答案:

答案 0 :(得分:0)

我认为您可以通过两种方式解决此问题,具体取决于您之后对新添加的实体的处理方式:

  1. 在为新用户使用之前重新附加该部分:

    _context.Sections.Attach(section)
    var user = new User
    {
       Name = "Alex",
       Section = section
    }     
    
  2. 仅将部分的主键添加给用户,例如对于 1-n 关系:

    var user = new User
    {
       Name = "Alex",
       SectionId = section.Id
    }
    

答案 1 :(得分:0)

我在带有实体框架的 Blazor 服务器应用程序中遇到了类似的问题。

即使我分离保存的对象,仍然会跟踪引用的属性对象。 我在跟踪器上调用了一个 clear 函数,而不是分离:

_dbContext.ChangeTracker.Clear();