简体   繁体   English

从ViewModel映射回DTO时出现AutoMapper问题

[英]AutoMapper issue when mapping back to DTO from ViewModel

Im having a problem in mapping back to DTO. 我在映射回DTO时遇到了问题。

DTO : DTO:

public class ServiceEntity : BaseChild
{
    public int Id { get; set; }
}

public class BaseChild
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Salary { get; set; }
    public string BkName { get; set; }
    public int BkPrice { get; set; }
    public string BkDescription { get; set; }
}

ViewModel : ViewModel:

public class BusinessEntity 
{
    public ChildBussiness Details { get; set; }
}

public class ChildBussiness
{
    public string NameFirst { get; set; }
    public string LastName { get; set; }
    public Books BookDetails { get; set; }
    public string Salary { get; set; }
}

public class Books
{
    public string BookName { get; set; }
    public int BookPrice { get; set; }
    public string BookDescription { get; set; }
}

Controller 调节器

For Mapping from DTO To ViewModel im using the below code, and its working fine. 使用下面的代码从DTO映射到ViewModel,它的工作正常。

public ActionResult Index()
{
    ServiceEntity obj = GetData();
    Mapper.CreateMap<ServiceEntity, BusinessEntity>()
        .ForMember(d => d.Details, o => o.MapFrom(x => new ChildBussiness { NameFirst = x.FirstName, LastName = x.LastName, Salary = x.Salary.ToString(), BookDetails = new Books { BookDescription = x.BkDescription, BookName = x.BkName, BookPrice = x.BkPrice }}));

    BusinessEntity objDetails = Mapper.Map<ServiceEntity, BusinessEntity>(obj);
}

While converting back im not able to do. 虽然转换回来我无法做到。 Below code i tried. 我尝试下面的代码。

.
.
.
ServiceEntity objser = new ServiceEntity();

Mapper.CreateMap<BusinessEntity, ServiceEntity>();
Mapper.CreateMap<Books, ServiceEntity>();

objser = Mapper.Map<BusinessEntity, ServiceEntity>(model);
.
.
.

But i didnt get any success. 但我没有取得任何成功。 For an example i provided few properties. 举个例子,我提供了一些属性。 I real time i might have more than 30 property. 我实时可能有30多个房产。 Any suggestion would be appreciated... 任何建议将不胜感激......

EDIT Thus you can change BusinessEntity implementation, you can use power of AutoMapper conventions and flattening. 编辑因此,您可以更改BusinessEntity实现,您可以使用AutoMapper约定和展平的强大功能。 Here is modified business entity: 这是修改后的业务实体:

public class BusinessEntity
{
    public string FirstName { get; set; } // Instead of NameFirst
    public string LastName { get; set; }
    public Book Bk { get; set; } // Bk instead of BookDetails
    public string Salary { get; set; }
}

public class Book
{
    public string Name { get; set; } // No prefixes
    public int Price { get; set; }
    public string Description { get; set; }
}

You need Bk name to allow flattening of Bk.Name to BkName . 您需要Bk名称以允许将Bk.Name BkName平为BkName Now all mappings will be generated in several lines: 现在所有映射都将生成几行:

// For mapping from service entity to book
Mapper.Initialize(cfg => cfg.RecognizePrefixes("Bk"));

Mapper.CreateMap<BusinessEntity, ServiceEntity>();

// Trick to un-flatten service entity
// It is mapped both to Book and BusinessEnity
Mapper.CreateMap<ServiceEntity, Book>();
Mapper.CreateMap<ServiceEntity, BusinessEntity>()
        .ForMember(d => d.Bk, m => m.MapFrom(s => s));

That's it. 而已。 All 30 properties will be mapped by convention: 所有30个属性将按约定映射:

var service = new ServiceEntity {
    FirstName = "Sergey",
    LastName = "Berezovskiy",
    Salary = 5000,
    BkName = "Laziness in Action",
    BkDescription = "...",
    BkPrice = 42
};

var business = Mapper.Map<BusinessEntity>(source);
var anotherService = Mapper.Map<ServiceEntity>(business);

ORIGINAL ANSWER Thus you are using custom mapping, from service entity to business entity, then default mapping also will not work for backward mapping. 原始答案因此,您使用自定义映射,从服务实体到业务实体,然后默认映射也不适用于向后映射。 You should manually provide mappings for members: 您应该手动为成员提供映射:

Mapper.CreateMap<BusinessEntity, ServiceEntity>()
    .ForMember(d => d.FirstName, m => m.MapFrom(s => s.Details.NameFirst))
    .ForMember(d => d.LastName, m => m.MapFrom(s => s.Details.LastName))
    .ForMember(d => d.Salary, m => m.MapFrom(s => s.Details.Salary))
    .ForMember(d => d.BkName, m => m.MapFrom(s => s.Details.BookDetails.BookName))
    .ForMember(d => d.BkPrice, m => m.MapFrom(s => s.Details.BookDetails.BookPrice))
    .ForMember(d => d.BkDescription, m => m.MapFrom(s => s.Details.BookDetails.BookDescription));

But I think manual mapping is better in this case, then providing all this maps for individual properties. 但我认为在这种情况下手动映射更好,然后为各个属性提供所有这些映射。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM