6

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

ビューモデル:

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以上のプロパティを持っているかもしれません。任意の提案をいただければ幸いです...

4

1 に答える 1

2

EDITしたがって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));

ただし、この場合は手動マッピングの方が優れていると思います。その後、このすべてのマップを個々のプロパティに提供します。

于 2013-08-01T14:23:03.470 に答える