c# - 如何使用自动映射器将具有多对多关系的 DTO 映射到具有关系表的 EF 核心实体?

标签 c# asp.net-core entity-framework-core automapper fluent

我的数据库中有两个实体。 A 和 B。我还有一个关系表,表示这些实体 AB 之间的多对多关系:

public class A
{
    public ICollection<AB> ABs { get; set; }
}

public class B
{
    public ICollection<AB> ABs { get; set; }
}

public class AB
{
    public A A { get; set; }
    public B B { get; set; }
}

现在我想像这样在我的 dto 中隐藏这个关系表:

public class ADTO
{
    public ICollection<B> Bs { get; set; }
}

我想要一个 B 的集合,我的实例直接表示,而不是作为关系表。我想要一个自动映射器配置文件,该配置文件从实体 B 列表映射到以前不存在的实体 AB 列表,其中 B 作为属性,以及实例 A 本身。

我已经像这样实现了从 A 到 ADTO 的映射器:

public class AProfile : Profile
{
    public AProfile()
    {
        CreateMap<A, ADTO>()
            .ForMember(dest => dest.B, opt => opt.MapFrom(src => src.AB.Select(y => y.B).ToList()));
        CreateMap<ADTO, A>();
    }
}

我缺少的是相反的方向:从 ADTO 及其实体列表到 A 及其对关系表实体的引用。

最佳答案

像下面这样制作你的个人资料:

  CreateMap<ADTO, A>()
            .ForMember(dest => dest.AName, opt => opt.MapFrom(src => src.AName))
            .ForMember(dest => dest.ABs, opt => opt.MapFrom(src => src.Bs))
            .AfterMap((src, dest) =>{
                foreach(var b in dest.ABs)
                {
                    b.AId = src.Id;
                }
            });
  CreateMap<B, AB>()
            .ForMember(dest=>dest.BId,opt=>opt.MapFrom(src=>src.Id))
            .ForMember(dest=>dest.B,opt=>opt.MapFrom(src=>src));

关于c# - 如何使用自动映射器将具有多对多关系的 DTO 映射到具有关系表的 EF 核心实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60261273/

相关文章:

c# - 在泛型类 <T,U> 的方法中比较 T 的两个变量(从 C++ 到 C# 的代码移植)

c# - 这个请求是由 EF Core buggy 生成的还是我的代码?

c# - 如何覆盖现有的扩展方法

c# - 仅使一列可排序的最简单方法

C# 3 维数组

c# - 无法确定导航属性 EF Core 表示的关系

c# - 什么时候应该在 Asp.Net Core 中使用 Task.Run?

c# - Angular 6 向 .NET Core API 发出请求

c# - Linq.Select() 中的嵌套表达式方法调用

c# - 无法解析 ApplicationDbContext 中类型的服务