我正在尝试使我的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'
我该如何解决?
答案 0 :(得分:0)
我认为您可以通过两种方式解决此问题,具体取决于您之后对新添加的实体的处理方式:
在为新用户使用之前重新附加该部分:
_context.Sections.Attach(section)
var user = new User
{
Name = "Alex",
Section = section
}
仅将部分的主键添加给用户,例如对于 1-n 关系:
var user = new User
{
Name = "Alex",
SectionId = section.Id
}
答案 1 :(得分:0)
我在带有实体框架的 Blazor 服务器应用程序中遇到了类似的问题。
即使我分离保存的对象,仍然会跟踪引用的属性对象。 我在跟踪器上调用了一个 clear 函数,而不是分离:
_dbContext.ChangeTracker.Clear();