2017-07-20 44 views
0

我有一个非常奇怪的错误,我无法得到我的头。我使用的是带有AutoMapper.CollectionAutoMapper.Collection.EntityFramework的AutoMapper 6。具有实体框架的C#AutoMapper - 适用于列表,但不适用于单个可为空的实例

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

enter image description here

映射:

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; } 
} 
+1

*“其他单一性质的作品,以及,但由于某种原因,图像在作祟。” * - 可是你在你的代码片断说该映射'Image'工作和'Contact'不起作用。你能否提供一个实际显示问题的[mcve]? – poke

+0

@poke在截图中可以看到,构造得不是很好,它应该是'每个组件都更新了Image中的一部分'。 – Ogglas

+0

嗯,我还没有看到任何证明*任何*嵌套复杂属性得到实际映射。 'updatedImage'中的'Article'也是null。 – poke

回答

1

终于解决了它,我已经忘了Contact标记Imagevirtual。做完这些之后,所有的事情都开始了。

public virtual Image Image { get; set; } 
0

我认为你需要告诉在配置您的联系映射明确地使用映射图像VM。可能有一个或两个错别字,因为我从内存中这样做,但它应该是类似于:

.ForMember(x => x.Image, opt => opt.MapFrom(contact => Mapper.Map<ImageViewModel, Image>(contact.ImageVm);)) 
+0

[本文](https://github.com/AutoMapper/AutoMapper/wiki/Nested-mappings)建议您不需要明确指定。 – poke

+0

我不必在其他地方做这个映射。我认为这与我正在更新当前对象有关,在当前对象中'Image'为空。我做了一个新的检查并创建了一个新的对象,然后创建了'Image'。 'var newContact = Mapper.Map (contactVm);'@poke – Ogglas

+0

够公平的。如果图像为空,那么这就解释了它 - 它有什么映射?如果我正确理解你,确保在映射之前加载图像? –

相关问题