2015-11-04 36 views
1

實體包含標籤列表。客戶端收到標籤ID的更新列表。有些標籤需要從列表中刪除,有些則添加到列表中。我決定這個問題的方式如下:什麼是更新列表的最佳實踐?

有兩類

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

它看起來不錯:) –

+0

標籤需要刪除/添加根據什麼標準?人們如何在不知道要求的情況下告訴你這是否是一個好的解決方案? – ataravati

回答

0

正如我在評論中提到的那樣,您需要解釋需求,以便人們可以告訴您是否有更好的方法來執行您需要做的事情,但是,即使不知道需求,我也可以告訴您有什麼你的邏輯錯了。

您先刪除所有未從entity.Tagstags陣列中的標籤,然後從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(); 
}