实体包含标签列表。客户端会收到更新的标记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)
正如我在评论中提到的那样,你需要解释这些要求,这样人们才能告诉你是否有更好的方法来做你需要做的事情,但是,即使不知道要求,我也可以告诉你你的逻辑出了问题。
您首先从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();
}