ef core + automapper + dto:反向映射多对多

时间:2018-03-29 07:22:10

标签: c# many-to-many automapper entity-framework-core dto

我遇到了多对多关系的反向映射问题。我总是得到错误“无法跟踪实体类型'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核心?

0 个答案:

没有答案