簡體   English   中英

AutoMapper:一對多->多對多

[英]AutoMapper: One-to-many -> Many-to-many

我是AutoMapper的新手。 我也很難配置AutoMapper在能夠映射UserViewModel具有多個TagViewModel成許多一對多關系( RecipeEntity <-> TagEntity這是所需要的實體框架的核心,其中UserAndTagEntity是接合表。

數據對象:

public class TagEntity
{
    public string Name { get; set; }

    public virtual ICollection<UserAndTagEntity> UserAndTags { get; set; } = new List<UserAndTagEntity>();
}

public class UserEntity
{
    public string Name { get; set; }

    public virtual ICollection<UserAndTagEntity> UserAndTags { get; set; } = new List<UserAndTagEntity>();
}

public class UserAndTagEntity
{
    public int Id { get; set; }
    public virtual UserEntity User { get; set; }
    public virtual TagEntity Tag { get; set; }
}

public class UserViewModel
{
    public string Name { get; set; }

    public IList<TagViewModel> Tags { get; set; }
}

public class TagViewModel
{
    public string Name { get; set; }
}

測試例:

var config = new MapperConfiguration(cfg => {
    cfg.CreateMap<UserEntity, UserViewModel>()
        .ForMember(
            dto => dto.Tags,
            opt => opt.MapFrom(x => x.UserAndTags.Select(y => y.Tag)));

    cfg.CreateMap<UserViewModel, UserEntity>()
        .ForMember(
            dto => dto.UserAndTags,
            opt => opt.MapFrom(x => x.Tags))
        .AfterMap((model, entity) =>
        {
            foreach (var entityUserAndTag in entity.UserAndTags)
            {
                entityUserAndTag.User = entity;
            }
        });

    cfg.CreateMap<TagViewModel, UserAndTagEntity>();
});

var user = new UserViewModel()
{
    Name = "User",
    Tags = new List<TagViewModel>
    {
        new TagViewModel {Name = "Tag 1"},
        new TagViewModel {Name = "Tag 2"},
        new TagViewModel {Name = "Tag 3"},
        new TagViewModel {Name = "Tag 4"},
    }
};

IMapper mapper = config.CreateMapper();

var map = mapper.Map<UserViewModel, UserEntity>(user);

此工程部分-我的問題是, TagUserAndTagEntity為空。

使用以下配置可以實現從UserViewModelUserEntity的映射:

CreateMap<UserViewModel, UserEntity>()
    // (1)
    .ForMember(entity => entity.UserAndTags, opt => opt.MapFrom(model => model.Tags))
    // (5)
    .AfterMap((model, entity) =>
    {
        foreach (var entityUserAndTag in entity.UserAndTags)
        {
            entityUserAndTag.User = entity;
        }
    });

// (2)
CreateMap<TagViewModel, UserAndTagEntity>()
    // (3)
    .ForMember(entity => entity.Tag, opt => opt.MapFrom(model => model));

// (4)
CreateMap<TagViewModel, TagEntity>();

說明:

需要線(1),因為目標和源屬性名稱不匹配,所以我們只是告訴AutoMapper映射Tags的財產UserViewModelUserAndTags的財產UserEntity

請注意,映射不需要源屬性和目標屬性類型匹配。 如果沒有(在這種情況下),則AutoMapper將使用單獨的配置映射它們。

在我們的示例中,源屬性類型為IList<TagViewModel> ,目標屬性類型為ICollection<UserAndTagEntity> 忽略集合類型-AutoMapper知道如何轉換它們。 它不知道並且需要指定的是元素類型之間的映射。 在我們的例子中,從TagViewModelUserAndTagEntity 因此,需要映射(2)。

里面的映射(2),我們只有部分之一,所以我們使用(3)指定-即我們映射TagViewModelTag的財產UserAndTagEntity 同樣,類型不匹配,因此我們需要從TagViewModelTagEntity的映射(4)。

最終結果將是帶有UserAndTags集合的UserEntity實例, UserAndTags填充了具有正確Tag屬性的UserAndTagEntity實例。 然后,使用步驟(5)填充這些實例的User屬性。

暫無
暫無

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

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