当我们在一个Config类中配置了一对多的关系,例如标签时:
builder.HasMany(item => item.Tags)
.WithMany()
.UsingEntity(j => j.ToTable("item_tags")); // 配置中间表的名称
当我们在更新item过程中会发现,若写成如下示例:
直接把数据传输对象的tags直接赋值给item的tags,这时会丢出一个异常,也就是entity type cannot be tracked(实体类无法被追踪)
DbSet<Item> items;
public void update(DataTransferObject dto){
// 通过Id找到item
var item = item.find(dto.Id);
item.tags = dto.tags;
items.Update(item);
}
此时我们引入tag的DbSet,通过遍历的方法:
DbSet<Item> items;
DbSet<Tag> tags;
public void update(DataTransferObject dto){
// 通过Id找到item
var item = item.find(dto.Id);
// 遍历传输对象的标签
items.tags.Clear();
dto.tags.Foreach((t)=>{
// 从tags中拿到实体
var tag = tags.find(t.id);
// 再加入到item的tags中,注意要添加的是从数据库查询出来的tag而不是遍历的对象t
item.tags.add(tag);
})
items.Update(item);
}
这时EF Core就能追踪到tag实体了