2015-11-04 4 views
1

Сущность содержит список тегов. Клиент получает обновленный список идентификаторов тегов. Некоторые теги нужно удалить из списка, а некоторые добавить в список. Я решил эту проблему следующим образом:Каковы наилучшие практики для списка обновлений?

Есть два класса

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

И Update метод

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

Он выглядит хорошо для меня :) –

+0

Теги должны быть удалены/добавлены на основании каких критериев? Как люди должны сказать вам, если это хорошее решение, не зная требований? – ataravati

ответ

0

Как я уже упоминал в комментарии, вам нужно объяснить требования, чтобы люди могли сказать вам, есть ли лучший способ делать то, что вам нужно делать, однако, даже не зная требований, я могу сказать вам, что есть что-то неправильно с вашей логикой.

Вы первый удаление всех тегов, которые не в 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(); 
} 
Смежные вопросы