10

古いマッピング標準からオートマッパーに変換するのにかなりの時間を費やしています。

ここに私のクラスがあります

// 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());

どのように無視またはカスタム マッピングを構成しても、このネストが気に入らないようです。このような複雑なオブジェクトを使用したマッピングを行う方法を教えてくれるオートマッパーの専門家。エンティティ クラスは、EF6 edmx ファイルを介して生成されています。

4

2 に答える 2

13

したがって、基本的にここでの問題は、LibraryItemCategoryに属するeach から、各のプロパティのプロパティを含むにマップLibraryItemすることです。LibraryCategoryModelLibraryItemCatalogLibraryCatalog

まず、コレクションを相互に正しくマップします。

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

LibraryItemCategory次に、 の各内部をLibraryItem.LibraryItemCategoriesにマッピングすることに注意する必要がありますLibraryCatalogModelLibraryItemCategory問題で述べたように、それぞれのLibraryCatalogプロパティにアクセスし、代わりにそこから実際にマップする必要があります。これがどのように見えるかは次のとおりです。

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

ここで、AutoMapper に a から a にマップするLibraryItemCategoryには、内部プロパティで への別の呼び出しを使用しLibraryCategoryModelて を構築する必要があることを伝えています。LibraryCategoryModelMapper.MapLibraryCategory

次に、あとは からLibraryCategoryへのマッピングを定義するだけLibraryCategoryModelです。

Mapper.CreateMap<LibraryCategory, LibraryCategoryModel>();

Mapper.Mapこれで、 on を呼び出すとLibraryItem、すべてが処理されます。


LibraryItemCategoryまたは、 toからマップを削除し、LibraryCategoryModelLINQ を使用して、マッピング定義 from toLibraryCategoryで実際にマップしたい のコレクションを作成することもできます。LibraryItemLibraryItemModel

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

LibraryCategoryからへのマッピングが必要なのは明らかですが、マッピングLibraryCategoryViewModelが少ないため、これを好むかもしれません。

于 2014-07-17T18:19:15.370 に答える