我遇到了多对多关系的反向映射问题。我总是得到错误“无法跟踪实体类型'ABXrefModel'的实例,因为已经跟踪了具有相同键值的另一个实例”
我的模特:
public partial class AModel
{
public AModel()
{
ABXref = new HashSet<ABXrefModel>();
}
public int Id { get; set; }
public ICollection<ABXrefModel> ABXref { get; set; }
}
public partial class BModel
{
public BModel()
{
ABXref = new HashSet<ABXrefModel>();
}
public int Id { get; set; }
public ICollection<ABXrefModel> ABXref { get; set; }
}
public partial class ABXrefModel
{
public int AId { get; set; }
public int BId { get; set; }
public BModel B { get; set; }
public AModel A { get; set; }
}
我的dto:
public class ADto
{
public int Id { get; set; }
public ICollection<BDto> Bn { get; set; }
}
public class BDto
{
public int Id { get; set; }
}
public class ABXrefDto
{
public int AId { get; set; }
public int BId { get; set; }
}
和我的映射配置文件:
CreateMap<AModel, ADto>()
.ForMember(dto => dto.Bn, opt => opt.MapFrom(x => x.ABXref.Select(y => y.B).ToList()))
.ReverseMap()
.ForMember(x => x.ABXref, opt => opt.MapFrom(dto => dto.Bn.Select(y => new ABXrefDto{BId = y.Id, AId = dto.Id})))
假设AModel有一个ABdrefModel,AId = 1,BId = 1,我想从dto更新模型,AId = 1,BId = 1,AId = 1,BId = 2我得到了上一个错误。映射后,集合只有两个值,但ef核心不知道其中一个是现有的。但我需要始终将所有Bn传递给ADto,因为必须删除丢失的Bn。我怎么解决这个问题。我是否必须修改映射或更新ef核心?