c# – 复杂对象/嵌套映射中的自动映射和映射列表

前端之家收集整理的这篇文章主要介绍了c# – 复杂对象/嵌套映射中的自动映射和映射列表前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一段时间从旧的映射标准转换为automapper.

这是我的课程

// Models
public class BaseModel
{
    public Int64 Id { get; set; }
    public Guid UniqueId { get; set; }
    public DateTime? CreateDate { get; set; }
    public DateTime? LastUpdate { get; set; }
} 

public class LibraryItemModel : BaseModel
{
    public string Name { get; set; }
    public string Description { get; set; }
    public string URL { get; set; }
    public bool IsActive { get; set; }
    public List<LibraryCategoryModel> Categories { get; set; }
}   

public class LibraryCategoryModel : BaseModel
{
    public string Description { get; set; }
}


// Entity Classes

public partial class LibraryItem
{
    public LibraryItem()
    {
        this.LibraryItemCategories = new HashSet<LibraryItemCategory>();
    }

    public long Id { get; set; }
    public System.Guid UniqueId { get; set; }
    public string Description { get; set; }
    public string URL { get; set; }
    public System.DateTime CreateDate { get; set; }
    public System.DateTime LastUpdate { get; set; }
    public bool IsActive { get; set; }
    public string Name { get; set; }

    public virtual ICollection<LibraryItemCategory> LibraryItemCategories { get; set; }
}
// comes from a ternary table in DB... many to many
public partial class LibraryItemCategory
{
    public long LibraryItemId { get; set; }
    public long LibraryCategoryId { get; set; }
    public System.DateTime CreateDate { get; set; }
    public System.DateTime LastUpdate { get; set; }

    public virtual LibraryCategory LibraryCategory { get; set; }
    public virtual LibraryItem LibraryItem { get; set; }
}

public partial class LibraryCategory
{
    public LibraryCategory()
    {
        this.LibraryCategoryRoles = new HashSet<LibraryCategoryRole>();
        this.LibraryItemCategories = new HashSet<LibraryItemCategory>();
    }

    public long id { get; set; }
    public System.Guid UniqueId { get; set; }
    public string Description { get; set; }
    public System.DateTime CreateDate { get; set; }
    public System.DateTime LastUpdate { get; set; }

    public virtual ICollection<LibraryCategoryRole> LibraryCategoryRoles { get; set; }
    public virtual ICollection<LibraryItemCategory> LibraryItemCategories { get; set; }
}


    // Old Conversion code doing it the long way

    private LibraryItemModel Convert(Entities.LibraryItem libraryItem)
    {

        var newLibraryItem = new LibraryItemModel
        {
            UniqueId = libraryItem.UniqueId,Name = libraryItem.Name,Description = libraryItem.Description,URL = libraryItem.URL,CreateDate = libraryItem.CreateDate,LastUpdate = libraryItem.LastUpdate,IsActive = libraryItem.IsActive,Categories = new List<LibraryCategoryModel>()
        };

        foreach (var lc in libraryItem.LibraryItemCategories)
        {
            var newCategory = new LibraryCategoryModel
            {
                UniqueId = lc.LibraryCategory.UniqueId,Description = lc.LibraryCategory.Description,CreateDate = lc.LibraryCategory.CreateDate,LastUpdate = lc.LibraryCategory.LastUpdate
            };

            newLibraryItem.Categories.Add(newCategory);
        }

        return newLibraryItem;
    }


    // My attempt at automapper to go between the models and entities
    Mapper.CreateMap<EF.Entities.LibraryItem,LibraryItemModel>();
    Mapper.CreateMap<LibraryItemModel,EF.Entities.LibraryItem>();
          .ForMember(lim => lim.LibraryItemCategories,o => o.Ignore()
    Mapper.CreateMap<EF.Entities.LibraryCategory,LibraryCategoryModel>();
    Mapper.CreateMap<LibraryCategoryModel,EF.Entities.LibraryCategory>()
          .ForMember(lcm => lcm.LibraryCategoryRoles,o => o.Ignore())
          .ForMember(lcm => lcm.LibraryItemCategories,o => o.Ignore());

无论我如何配置忽略或自定义映射,它似乎都不喜欢这种嵌套.任何Automapper专家都可以告诉我如何使用这样的复杂对象进行映射. enitity类是通过EF6 edmx文件生成的.

解决方法

所以基本上问题在于你想要从属于LibraryItem的每个LibraryItemCategory映射到包含每个LibraryItemCatalog的LibraryCatalog属性属性的LibraryCategoryModel.

首先,您要将集合正确映射到彼此:

Mapper.CreateMap<LibraryItem,LibraryItemModel>()
    .ForMember(
        dest => dest.Categories,opt => opt.MapFrom(src => src.LibraryItemCategories));

接下来,您需要担心将LibraryItem.LibraryItemCategories中的每个LibraryItemCategory映射到LibraryCatalogModel.如问题中所述,您需要访问每个LibraryItemCategory的LibraryCatalog属性,并实际上从中映射.这看起来的方式是:

Mapper.CreateMap<LibraryItemCategory,LibraryCategoryModel>()
    .ConstructUsing(ct => Mapper.Map<LibraryCategoryModel>(ct.LibraryCategory))
    .ForAllMembers(opt => opt.Ignore());

在这里,我们告诉AutoMapper要从LibraryItemCategory映射到LibraryCategoryModel,我们需要使用内部LibraryCategory属性上的另一个Mapper.Map调用来构造LibraryCategoryModel.

接下来,剩下要做的就是定义从LibraryCategory到LibraryCategoryModel的映射:

Mapper.CreateMap<LibraryCategory,LibraryCategoryModel>();

现在,在LibraryItem上调用Mapper.Map应该为您处理所有事情.

或者,您可以将MapItemCategory中的地图移除到LibraryCategoryModel,并使用LINQ创建您实际想要从LibraryItem到LibraryItemModel的映射定义中映射的LibraryCategorys集合:

Mapper.CreateMap<LibraryItem,opt => opt.MapFrom(
            src => src.LibraryItemCategories.Select(lb => lb.LibraryCategory)));

你显然仍然需要从LibraryCategory到LibraryCategoryviewmodel的映射,但你可能更喜欢这个,因为它涉及更少的映射.

猜你在找的C#相关文章