【发布时间】:2017-05-20 13:05:53
【问题描述】:
给定 2 个源实体:
class SourceA
{
public string Info1 { get; set; }
public string Info2 { get; set; }
}
class SourceB
{
public A A { get; set; }
public string OptionalExtraInfo { get; set; }
}
和一个目的地类别:
class Dest
{
public string ModifiedInfo1 { get; set; }
public string ModifiedInfo2 { get; set; }
public string ModifiedOptionalExtraInfo { get; set; }
}
我想让以下代码与 EF6 一起使用:
var destsFromA = dbContext.SourcesA.ProjectTo<Dest>().ToArray();
var destsFromB = dbContext.SourcesB.ProjectTo<Dest>().ToArray();
所以我定义了 Automapper.net 映射:
- 来源A => 目的地
- 来源B => 目的地
关于如何将 Info1 投影到 ModifiedInfo1 和 Info2=>ModifiedInfo2 的自定义规则:
CreateMap<SourceA, Dest>()
.ForMember(x => ModifiedInfo1, opt => opt.MapFrom(src => src.Info1 + " something else-1")
.ForMember(x => ModifiedInfo2, opt => opt.MapFrom(src => src.Info1 + " something else-2")
.ForMember(x => ModifiedOptionalExtraInfo, opt => opt.Ignore());
CreateMap<SourceB, Dest>()
.ForMember(x => ModifiedInfo1, opt => opt.MapFrom(src => src.A.Info1 + " something else-1")
.ForMember(x => ModifiedInfo2, opt => opt.MapFrom(src => src.A.Info2 + " something else-2")
.ForMember(x => ModifiedOptionalExtraInfo, opt => opt.MapFrom(src => src.OptionalExtraInfo + " something else-3"));
如何在第二次映射中重用 ModifiedInfo1、ModifiedInfo2 的映射规则,因为它们与第一种情况相同?
更新在我的某些情况下,我想出了如何以自然的方式重用 SourceA => Dest 映射。
首先,我添加了一个反向引用(导航属性)SourceA.B,因为这些实体实际上是一对零或一的关系,EF 必须知道这一点。
然后我在我的应用程序代码中更改了聚合根,它变成了:
var destsFromA = dbContext.SourcesA.ProjectTo<Dest>().ToArray();
var destsFromB = dbContext.SourcesB.Select(x => x.A).ProjectTo<Dest>().ToArray();
所以我只需要使用唯一的 SourceA => Dest 映射
最后我改变了映射本身:
CreateMap<SourceA, Dest>()
.ForMember(x => ModifiedInfo1, opt => opt.MapFrom(src => src.Info1 + " something else-1")
.ForMember(x => ModifiedInfo2, opt => opt.MapFrom(src => src.Info1 + " something else-2")
.ForMember(x => ModifiedOptionalExtraInfo, opt => opt.MapFrom(src => src.B ? src.B.OptionalExtraInfo + " something else-3" : null);
由于这是一个问题的解决方案,而不是原始问题的答案,我接受了 Ilya Chumakov 的答案作为正确答案。
【问题讨论】:
-
拥有一个属性指向两个源类的中间类,然后在这个中间类上定义 dest 映射怎么样?
-
@DimiToulakis 你能提供一个代码 sn-p 吗?
-
稍后再做 - 目前不在我的笔记本电脑上
标签: c# .net entity-framework automapper projection