EF Core 无跟踪和 Add() 或 Update()

Gio*_*Gio 9 c# entity-framework dbcontext ef-core-3.1

我试图让我的 DbContext 在没有跟踪的情况下工作。

public class MyContext: DbContext
{
    public MyContext() 
    {
        ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

_context.Users.Add(user);
await _context.SaveChangesAsync();
_context.Entry(user).State = EntityState.Detached;
Run Code Online (Sandbox Code Playgroud)

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

例如:

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();
Run Code Online (Sandbox Code Playgroud)

结果出现错误:

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

我怎样才能解决这个问题?

小智 10

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

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

_dbContext.ChangeTracker.Clear(); 
Run Code Online (Sandbox Code Playgroud)


Rad*_*all 1

我认为您可以通过两种方式解决这个问题,具体取决于您之后对新添加的实体所做的操作:

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

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

    var user = new User
    {
       Name = "Alex",
       SectionId = section.Id
    }
    
    Run Code Online (Sandbox Code Playgroud)