我在回映到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:
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; }
}
控制器
使用以下代码从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);
}
虽然转换回我无法做到。我尝试下面的代码。
.
.
.
ServiceEntity objser = new ServiceEntity();
Mapper.CreateMap<BusinessEntity, ServiceEntity>();
Mapper.CreateMap<Books, ServiceEntity>();
objser = Mapper.Map<BusinessEntity, ServiceEntity>(model);
.
.
.
但我没有取得任何成功。举个例子,我提供了一些属性。我实时可能有30多个房产。 任何建议将不胜感激......
答案 0 :(得分:1)
编辑因此您可以更改BusinessEntity
实施,您可以使用AutoMapper惯例和展平功能。这是修改后的业务实体:
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; }
}
您需要Bk
名称才能将Bk.Name
展平为BkName
。现在所有映射都将生成几行:
// 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));
就是这样。所有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 因此,您使用自定义映射,从服务实体到业务实体,然后默认映射也不适用于向后映射。您应该手动为成员提供映射:
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));
但我认为在这种情况下手动映射更好,然后为各个属性提供所有这些映射。