EF Core一对多出现entity type cannot be tracked的解决方案

当我们在一个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实体了
 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值