问题描述
当在 Entity Framework Core 中先删除实体、再修改其ID 、然后重新添加时发现的实体未被删除。
问题代码示例
问题分析
当我第一次调用RemoveRange时,ChangeTracker 将 tag 标志为 Delete
ChangeTracker的Debug View 如下所示- Tag {Id: 3cb7d0a8-e044-4818-9afd-4f09c20ae60a} Deleted
复制代码 当执行完 entity.Tags.ForEach(x=>{ x.Id = Guid.NewGuid();}); 后
ChangeTracker的Debug View 如下所示- Tag {Id: ac9d9fc7-5a8d-4b2e-9ac7-ca1a2778af8d} Deleted
复制代码 可以看到 Tag 的Id 产生了变革,这说明 ChangeTracker 追踪的是对象,自此tag的Id产生了变革,便无法删除了对于Id的数据了
当执行后续的AddRanage时,tag就酿成了Add
ChangeTracker的Debug View 如下所示- Tag {Id: ac9d9fc7-5a8d-4b2e-9ac7-ca1a2778af8d} Added
复制代码 所以就导致了原先想要删除Tag的删除信息丢失。
根本原因: 就是 add和remove的都是同一个对象的引用,变动Id导致了数据的错位。
办理方案
自行选择
- var items = entity.Tags.Select(x=>x.Clone()).ToList().ForEach(x => { x.Id = Guid.NewGuid(); });
- _db.AddRange(items);
复制代码- var childItems = entity.Tags;
- var deleteItem = temp.ExceptBy(childItems.Select(x => x.Id), x => x.Id);
- var addItem = childItems.ExceptBy(temp.Select(x => x.Id), x => x.Id);
- var update = childItems.IntersectBy(temp.Select(x => x.Id), x => x.Id);
- _db.RemoveRange(deleteItem);
- _db.AddRange(addItem);
- _db.UpdateRange(update);
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |