繁体   English   中英

C# Entity Framework 删除子表(关系)数据并更新父表

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM