2013-08-01 12 views
6

これは、DTOへのマッピングに問題があります。以下のコード、およびその作業罰金を使用してIMをViewModelにするDTOからマッピング用ViewModelからDTOに戻ってマッピングするときのAutoMapperの問題

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:

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 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以上の財産を持つかもしれません。 任意の提案はこのようにあなたがAutoMapper規則及び平坦化のパワーを使用することができ、BusinessEntity実装を変更することができます...

+0

エラーが発生しているのか、空のプロパティだけがありますか? –

答えて

1

EDITをいただければ幸いです。ここでは修正されたビジネスエンティティは:

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

あなたはBkNameBk.Nameの平坦化を可能にしBk名前が必要です。これですべてのマッピングがいくつかの行に生成されます:

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

しかし、私は、個々の特性のために、このすべてのマップを提供し、手動マッピングが、この場合には優れていると思う:あなたは手動でメンバーのマッピングを提供する必要があります。

+0

すべてのプロパティのimマッピングがある場合、なぜ私はAutoMapperを使用するのですか?私はインスタンスを作成して直接バインドできます。 – Vino

+0

@ user2640897だからこそ、私は* "しかし、私は手動マッピングがこの場合には良いと思う" * –

+0

もう一つの解決策を見つけました。ビジネスエンティティでプロパティを使用する代わりに、私はちょうどBUsinessEntity&MappedでChildBussinessを継承しました。それはうまくいく。 – Vino

関連する問題