簡體   English   中英

使用 EF Core 刪除不在范圍內的所有實體?

[英]Remove all entities not in a range using 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的整個 people 表. 我知道我可以這樣做:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM