Говоря Entity Framework, чтобы сравнить и обновить коллекцию - PullRequest
0 голосов
/ 30 октября 2019

Я хочу обновить коллекцию, используя EF. Один из способов сделать это - удалить старую коллекцию и вставить обновленную. Я не уверен, что это хороший подход, потому что таким образом мои идентификаторы будут очень быстро увеличиваться в БД.

Другой способ - сравнить каждый элемент с базой данных, чтобы узнать, был ли он обновлен, добавленили удален. Что кажется большой работой, особенно если есть классы со многими внутренними коллекциями.

Вопрос: есть ли более простой способ заставить EF сравнивать обновленный список с оригинальным (из БД) и обновлять оригинальныйодин (удалить, добавить и обновить)?

У меня есть какой-то код, который работает для меня, но он кажется слишком сложным (даже если мне нужно сделать это для всех внутренних списков).

Прямо сейчас: сравнивая идентификаторы, я знаю, какие из них новые, удалены или имеют одинаковые идентификаторы (необходимо вызвать update).

nIds = userNeighborhoods.Select(n => n.Id);
dbIds = db.Neighborhoods.Select(n => n.Id).ToList();
// Get deleted ids, and remove them from roomDBs.
deleted = dbIds.Except(nIds);
foreach (int? id in deleted)
db.Neighborhoods.DeleteByKey(id);
// Add new.
db.Neighborhoods.AddRange(userNeighborhoods.Where(r => !r.Id.HasValue));
// Update.
updated = dbIds.Intersect(nIds);

foreach (int? id in updated)
{
    NeighborhoodDB neighborhoodDB = userNeighborhoods.Single(r => r.Id==id);
    db.Neighborhoods.Attach(neighborhoodDB);
    db.Entry(neighborhoodDB).State = EntityState.Modified;
}

db.SaveChanges();
...