使用 EF Core 删除不在某个范围内的所有实体?



假设我有一个数据库,people表中有以下条目:

id | companyId | name 
1  | 9         | Kevin
2  | 9         | Mike
3  | 9         | John

然后,我收到此put请求以更新实体:

[
{"id": 1, "name": "Kevin"},
{"id": 2, "name": "Michael"},
{"id": 0, "name": "Joe"}
]

因此,我需要更新 id 2,删除 id 3,然后添加新实体。 我知道_context.People.UpdateRange(entities)会更新现有实体并添加新实体,但我还需要删除 id 3。 基本上,json请求的内容应该是整个人员表where companyId = 9。 我知道我可以这样做:

var currentPeople = _context.People
.AsNoTracking()
.Where(e => e.companyId == request.companyId)
.ToListAsync();
var requestEntities = request
.Select(m => new PersonEntity(r))
.ToList();
var peopleToRemove = requestEntities
.Where(oldEntity => requestEntities.All(e => e.Id != oldEntity.Id))
.ToList();
using (var transaction = _context.Database.BeginTransaction())
{
_context.People.RemoveRange(peopleToRemove);
_context.People.UpdateRange(requestEntities);
await _context.SaveChangesAsync();
transaction.Commit();
}

但这非常笨拙。 EF Core 是否提供更好的解决方案? 谢谢!

您可以执行以下操作:

var existingPeopleList = _context.People.AsNoTracking()
.Where(e => e.companyId == request.companyId) 
.ToListAsync();
var requestEntities = request.Select(r => new PersonEntity(r)).ToList();
var requestedPeopleList = requestEntities.Select(re => new People()
{
Id = re.Id,
CompanyId = 9,
Name = re.Name
}).ToList();

var peopleToBeRemoved = existingPeopleList.Where(ep => requestedPeopleList.All(rp => rp.Id != ep.Id)).ToList();
var peopleToBeAdded = requestedPeopleList.Where(rp => existingPeopleList.All(ep => ep.Id != rp.Id)).ToList();
var peopleToBeUpdated = requestedPeopleList.Where(rp => existingPeopleList.Any(ep => ep.Id == rp.Id)).ToList();
_context.People.RemoveRange(peopleToBeRemoved);
_context.People.AddRange(peopleToBeAdded);
_context.People.UpdateRange(peopleToBeUpdated);
await _context.SaveChangesAsync();

最新更新