簡體   English   中英

Automapper 5.1.1繼承映射

[英]Automapper 5.1.1 inheritance mapping

您好我無法讓我的映射為繼承的類工作。 想法是只為基礎對象和接口創建一次映射,當子類實現自己的成員時,為那些未在基類或基礎中定義的成員配置映射。

讓我從示例代碼開始。

public class DtoClass {
   public string Field1 { get; set; }
   public string Field2 { get; set; }
   public string Field3 { get; set; }
}

public interface IField3 {
   public string EntityField3 { get; set; }
}

public class BaseEntityClass {
   public string EntityField1 { get; set; }
}

public class ChildEntityClass : BaseEntityClass, IField3  {
   public string EntityField2 { get; set; }
   public string EntityField3 { get; set; }
}


CreateMap<BaseEntityClass, DtoClass>()
   .ForMember(c => c.Field1 , m => m.MapFrom(a => a.EntityField1))
   .Include<ChildEntityClass, DtoClass>();

CreateMap<IField3, DtoClass>()
   .ForMember(c => c.Field3 , m => m.MapFrom(a => a.EntityField3));

CreateMap<ChildEntityClass, DtoClass>()
   .ForMember(c => c.Field2 , m => m.MapFrom(a => a.EntityField2));

附加代碼dosnt工作的課程。 打電話時:

AutoMapper.Mapper.Map<ChildEntityClass, DtoClass>(instanceOfChildEntityClass);

我只獲得在CreateMap<ChildEntityClass, DtoClass>().中定義的映射成員CreateMap<ChildEntityClass, DtoClass>().

知道如何只為基類和接口實現一次映射嗎? 是的,我想將所有類型ChildEntityClass,BaseEntityClass和IField3映射到DtoClass。

任何提示都歡迎優雅配置這樣的映射。

編輯:為了清楚起見,我從子類中刪除了不必要的IncludeBase,但兩者都沒有
- 子類中的IncludeBase - 包含在基類Works中。 什么會導致這樣的問題?

你不應該使用.IncludeBase AND .Include - 選擇一個並堅持下去。 我更喜歡.IncludeBase ,因為我認為在子類中定義更有意義。 在您的情況下,您不能使用Include引用IField3,因為沒有隱式轉換。

以下代碼對我使用IncludeBase

CreateMap<BaseEntityClass, DtoClass>()
    .ForMember(dest => dest.Field1, opt => opt.MapFrom(src => src.EntityField1))
    ;

CreateMap<IField3, DtoClass>()
    .ForMember(dest => dest.Field3, opt => opt.MapFrom(src => src.EntityField3))
    ;

CreateMap<ChildEntityClass, DtoClass>()
    .ForMember(dest => dest.Field2, opt => opt.MapFrom(src => src.EntityField2))
    .IncludeBase<BaseEntityClass, DtoClass>()
    .IncludeBase<IField3, DtoClass>()
    ;

由於經常發生問題超出了我在示例代碼中提供的范圍。

在我的項目初​​始化方法中隱藏了類似的調用:

        foreach (string propName in map.GetUnmappedPropertyNames())
        {
            expr.ForMember(propName, opt => opt.Ignore());
        }

因此,即使在調用基類型的映射時,也會自動忽略未在子類中映射的所有列。 簡單而有問題。

上面的代碼可能適用於Mapper.Configuration.AssertConfigurationIsValid(); 通過。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM