/ / Які найкращі практики для списку оновлень? - entity-framework, linq, linq-to-entities

Які найкращі практики для списку оновлень? - entity-framework, linq, linq-to-entities

Сутність містить список тегів. Клієнт отримує оновлений список ідентифікаторів тегів. Деякі теги потрібно видалити зі списку, а деякі - до списку. Я вирішу цю проблему таким чином:

Існує два класи

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