C# AutoMapper с Entity Framework - Работает со списком, но не один обнуляемый экземпляр
У меня очень странная ошибка, что я не могу разобраться. Я использую AutoMapper 6 с AutoMapper.Collection
а также AutoMapper.Collection.EntityFramework
,
https://github.com/AutoMapper/AutoMapper.Collection
Как вы можете видеть на скриншоте ниже, каждый компонент обновляется, кроме изображения с нулевым значением для updatedContact
, Если я, однако, сделать явное отображение только для updatedImage
оно работает. Это также работает, чтобы обновить коллекцию изображений без проблем. Кто-нибудь испытывал это? Другие отдельные свойства также работают, но по какой-то причине Image
вызывает проблемы.
//Works
var updatedArticle = Mapper.Map<ArticleViewModel, Article>(articleVm, articleOriginal);
//Every component is updated a part from Image.
var updatedContact = Mapper.Map<ContactViewModel, Contact>(contactVm, contactOriginal);
//Works
var updatedImage = Mapper.Map<ImageViewModel, Image>(contactVm.Image);
//Works
var newContact = Mapper.Map<ContactViewModel, Contact>(contactVm);
Отображение:
cfg.CreateMap<ArticleViewModel, Article>(MemberList.Source)
.EqualityComparison((src, dst) => src.Id == dst.Id);
cfg.CreateMap<ImageViewModel, Image>(MemberList.Source)
.EqualityComparison((src, dst) => src.Id == dst.Id)
.ForSourceMember(x => x.IsDeleted, opt => opt.Ignore())
.ForMember(dest => dest.ImageBytes, opt => opt.MapFrom(src => Encoding.ASCII.GetBytes(src.Image)));
cfg.CreateMap<ContactViewModel, Contact>(MemberList.Source)
.EqualityComparison((src, dst) => src.Id == dst.Id)
.ForSourceMember(x => x.IsDeleted, opt => opt.Ignore())
.ForSourceMember(x => x.FullName, opt => opt.Ignore());
файлы:
public class ArticleViewModel
{
public int Id { get; set; }
...
public List<ImageViewModel> Images { get; set; }
}
public class Article : IEntity<int>
{
public int Id { get; set; }
...
public virtual ICollection<Image> Images { get; set; }
}
public class ContactViewModel
{
public int Id { get; set; }
...
public ImageViewModel Image { get; set; }
}
public class Contact: IEntity<int>
{
[Key]
public int Id { get; set; }
...
public int? ImageId { get; set; }
public Image Image { get; set; }
}
public class ImageViewModel
{
public int Id { get; set; }
public string Image { get; set; }
public string ImageType { get; set; }
public bool IsDeleted { get; set; }
}
public class Image : IEntity<int>
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public DateTime Created { get; set; }
public DateTime Updated { get; set; }
public byte[] ImageBytes { get; set; }
public string ImageType { get; set; }
public int? ArticleId { get; set; }
public virtual Article Article { get; set; }
}
2 ответа
Наконец решил это, я забыл отметить Image
как virtual
в Contact
, После этого все начало работать из коробки.
public virtual Image Image { get; set; }
Я думаю, что вы должны указать свой контактный маппер в конфигурации, чтобы явно использовать отображение для образа vm. Там может быть одна или две опечатки, поскольку я делаю это по памяти, но это должно быть похоже на:
.ForMember(x => x.Image, opt => opt.MapFrom(contact => Mapper.Map<ImageViewModel, Image>(contact.ImageVm);))