更新列表的最佳实践是什么?

时间:2015-11-04 16:52:38

标签: entity-framework linq linq-to-entities

实体包含标签列表。客户端会收到更新的标记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();
}

那是好方法,还是更好?

1 个答案:

答案 0 :(得分:0)

正如我在评论中提到的那样,你需要解释这些要求,这样人们才能告诉你是否有更好的方法来做你需要做的事情,但是,即使不知道要求,我也可以告诉你你的逻辑出了问题。

您首先从tags删除entity.Tags数组中不包含的所有标记,然后添加tags数组中不在entity.Tags数组中的所有标记在删除标记之前{1}}。而不是你可以删除所有标签,并在tags数组中添加所有内容。因此,您的方法可以简化为:

public void UpdateEntityTags(int entityId, int[] tags)
{
    var entity = _context.Entities.Find(entityId);

    entity.Tags.RemoveAll();
    entity.Tags.AddRange(tags);

    _context.SaveChanges();
}