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)
我认为您可以通过两种方式解决这个问题,具体取决于您之后对新添加的实体所做的操作:
在供新用户使用之前重新附加该部分:
_context.Sections.Attach(section)
var user = new User
{
Name = "Alex",
Section = section
}
Run Code Online (Sandbox Code Playgroud)
仅将部分的主键添加到用户,例如对于 1-n 关系:
var user = new User
{
Name = "Alex",
SectionId = section.Id
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16072 次 |
| 最近记录: |