Сутність містить список тегів. Клієнт отримує оновлений список ідентифікаторів тегів. Деякі теги потрібно видалити зі списку, а деякі - до списку. Я вирішу цю проблему таким чином:
Існує два класи
public class Entity
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int EntityId { get; set; }
public ICollection<Tag> Tags { get; set; }
}
public class Tag
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int TagId { get; set; }
public int EntityId { get; set; }
public Entity Entity { get; set; }
}
І оновити метод
public void UpdateEntityTags(int entityId, int[] tags)
{
var entity = _context.Entities.Find(entityId);
var sourceTags = entity.Tags.Select(x => x.TagId);
var removeList = sourceTags.Except(tags);
var tagsForRemove = entity.Tags.Where(x => removeList.Contains(x.TagId));
entity.Tags.RemoveRange(tagsForRemove);
var addList = tags.Except(sourceTags);
var tagsForAdd = _context.Tags.Where(x => removeList.Contains(x.TagId));
entity.Tags.AddRange(tagsForAdd);
_context.SaveChanges();
}
Це хороший спосіб, чи це краще?
Відповіді:
0 для відповіді № 1Як я вже згадав у коментарі, вам потрібнопояснити вимоги, щоб люди могли сказати вам, чи є кращий спосіб зробити те, що вам потрібно зробити, однак, навіть не знаючи вимог, я можу сказати вам, що у вас є щось не так з вашою логікою.
Ви в першу чергу вилучаєте всі теги, які не знаходяться в tags
масив від entity.Tags
, а потім ви додаєте всі теги з tags
Масив, що там, де немає в entity.Tags
перед тегами, де вилучено. Замість цього ви можете просто видалити всі теги і додати все в tags
масив Таким чином, ваш метод можна спростити таким чином:
public void UpdateEntityTags(int entityId, int[] tags)
{
var entity = _context.Entities.Find(entityId);
entity.Tags.RemoveAll();
entity.Tags.AddRange(tags);
_context.SaveChanges();
}