[英]C# Entity Framework Delete child table (relational ) data and update parent table
我正在使用实体框架来更新记录
用户(家长) | Email(儿童) |
---|---|
用户身份 | 电子邮件ID |
用户名 | 用户身份 |
电子邮件地址 |
在子表中,一个用户有多个 email 地址。 当用户更新时,删除所有子数据并保存父子数据。 我在添加和删除用户数据方面没有任何问题。
请注意,我只有用户表 DbSet 是可访问的。 我正在使用其他一些项目 DbContext
Private async Task updateUser(User _user){
var user = _configurationDbContext.Users
.Include(x => x.Emails)
.Where(x => x.UserId == _user.UserId)
.FirstOrDefault();
user.Emails.RemoveAll(x => x.UserId == _user.Id);
_configurationDbContext.Users.Update(_user);
return await _configurationDbContext.SaveChangesAsync();
}
我收到以下错误
InvalidOperationException:无法跟踪实体类型“Users”的实例,因为已经在跟踪具有相同键值 {'UserId'} 的另一个实例。 附加现有实体时,请确保仅附加一个具有给定键值的实体实例。 考虑使用“DbContextOptionsBuilder.EnableSensitiveDataLogging”来查看冲突的键值。
我可以知道如何使用Users DbSet 来实现这一点吗
问题是您有两个不同的User
实例指向同一个UserId
。
作为一种解决方法,您可能可以执行以下操作:
private async Task updateUser(User _user) {
var user = _configurationDbContext.Users
.Include(x => x.Emails)
.Where(x => x.UserId == _user.UserId)
.FirstOrDefault();
_configurationDbContext.Entry(_user).State = EntityState.Detached;
user.Emails.RemoveAll(x => x.UserId == _user.Id);
_configurationDbContext.Users.Update(user);
return await _configurationDbContext.SaveChangesAsync();
}
请注意,在调用_configurationDbContext.Entry(_user).State = EntityState.Detached;
之后,EF 将不再自动跟踪对_user
的更改。
尝试这个:
var user = _configurationDbContext.Users
.Include(x => x.Emails)
.Where(x => x.UserId == _user.UserId)
.FirstOrDefault();
user.Emails.RemoveAll(x => x.UserId == _user.Id);
// or you can try
user.Emails.Clear();
_configurationDbContext.Entry(user).CurrentValues.SetValues(_user);
return await _configurationDbContext.SaveChangesAsync()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.