首页 > 解决方案 > C# Entity Framework 删除子表(关系)数据并更新父表

问题描述

我正在使用实体框架来更新记录

用户(家长) 电子邮件(儿童)
用户身份 电子邮件ID
用户名 用户身份
电子邮件地址

在 Child 表中,一个用户有多个电子邮件地址。当用户更新时,删除所有子数据并保存父子数据。我在添加和删除用户数据方面没有任何问题。

请注意,我只有用户表 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来实现这一点吗

标签: c#entity-frameworkasp.net-coreentity-framework-coreparent-child

解决方案


尝试这个:

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()

推荐阅读