[英]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);
此工程部分-我的問題是, Tag
上UserAndTagEntity
為空。
使用以下配置可以實現從UserViewModel
到UserEntity
的映射:
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
的財產UserViewModel
到UserAndTags
的財產UserEntity
。
請注意,映射不需要源屬性和目標屬性類型匹配。 如果沒有(在這種情況下),則AutoMapper將使用單獨的配置映射它們。
在我們的示例中,源屬性類型為IList<TagViewModel>
,目標屬性類型為ICollection<UserAndTagEntity>
。 忽略集合類型-AutoMapper知道如何轉換它們。 它不知道並且需要指定的是元素類型之間的映射。 在我們的例子中,從TagViewModel
到UserAndTagEntity
。 因此,需要映射(2)。
里面的映射(2),我們只有部分之一,所以我們使用(3)指定-即我們映射TagViewModel
到Tag
的財產UserAndTagEntity
。 同樣,類型不匹配,因此我們需要從TagViewModel
到TagEntity
的映射(4)。
最終結果將是帶有UserAndTags
集合的UserEntity
實例, UserAndTags
填充了具有正確Tag
屬性的UserAndTagEntity
實例。 然后,使用步驟(5)填充這些實例的User
屬性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.