2016-05-11 2 views
2

私の問題は、Automapperを使用してドメインモデルを論理モデルにマッピングする際のループナビゲーションプロパティです。オートマッパーを使用してドメインモデルを論理モデルにマッピング

public class Customer 
{ 
    public long CustomerId { get; set; } 

    [Required] 
    public string Name { get; set; } 

    public virtual ICollection<Payment> Payments { get; set; }  
} 

public class Payment 
{ 
    public long PaymentId { get; set; } 

    public virtual Customer Customer { get; set; } 
} 

そして、ここで論理モデル::

public class CustomerModel 
{ 
    public long CustomerId { get; set; } 

    public string Name { get; set; } 

    public IEnumerable<PaymentModel> Payments { get; set; } 
} 

public class PaymentModel 
{ 
    public long PaymentId { get; set; } 

    public CustomerModel Customer { get; set; } 
} 

そして今、ここで

は、ドメインモデルの例があります。私はこのようなautomapper使用してマッピングを実行する場合:

public IQueryable<CustomerModel> GetCustomers() 
{ 
    return _db.Customer.ProjectTo<CustomerModel>(); 
} 

}

私はSystem.StackOverflowExceptionを取得しています。私はそれがナビゲーションのループのためだと理解しています。 AutomapperがICollection PaymentsをIEnumerable Paymentsにマッピングしようとしていますが、PaymentModelクラスのCustomerModelクラスへのナビゲーションがループしています。 CustomerModelへのナビゲーションプロパティなしで2番目の論理モデル(クラスPayment2)私は別のマッピングを実行する必要があります。ナビゲーションプロパティを持つ50のドメインモデルでは、迷惑になるでしょう。

もっと簡単で高速なソリューションがありますか?

+0

あなたはドメインモデルを生成するエンティティフレームワークを使用していますか? –

+0

おかしい、私はAutoMapperと同様のDTOを問題なくプロジェクトすることができます。最大深度または遅延ロードが無効のトリックはありません。問題は他のどこかにあるように見えます。 –

答えて

0

私はPayments財産の種類に変更することをお勧め:

public class CustomerModel 
{ 
    public List<PaymentModel> Payments { get; set; } 
} 

を、手動でそれをマップ:

Mapper.CreateMap<Payment, PaymentModel>() 
    .ForMember(dest => dest.Customer, opt => opt.Ignore()); 
Mapper.CreateMap<Customer, CustomerModel>() 
    .AfterMap((src, dest) => dest.Payments.ForEach(p => p.Customer = dest)); 

EDIT:マッピングがCustomerエンティティから開始されたときに残念なことに、それは場合にのみ動作します:

CustomerModel model = Mapper.Map<CustomerModel>(entity); 
あなたがもパフォーマンスを気にしない場合は210

DynamicMapを試してみてください。

CustomerModel model = Mapper.DynamicMap<CustomerModel>(entity); 
+0

問題は私が他のアクションのためにそれを使用するためにPaymentModelのクラスのCustomer Customerプロパティを必要としているということです – user3037147

+0

@ user3037147、そうです、それは 'Customer'エンティティをマップする場合にのみ動作します。 'Mapper.DynamicMap'コールはあなたに適していますか? –

+0

さて、私はオートマッパをあきらめました。私自身のマッピングが私のプロジェクトにとってより適切であるようです。 – user3037147

関連する問題