2

AutoMapper を使用してデータベース テーブルを ViewMode にバインドする単純な MVC3 アプリケーションを実装しましたが、automapper を使用して複雑な ViewModel をバインドできません。

これは私のドメインクラスです

namespace MCQ.Domain.Models
{
    public class City
    {
        public City()
        {
            this.AreaPincode = new List<AreaPincode>();
        }

        public long ID { get; set; }
        public string Name { get; set; }
        public int DistrictID { get; set; }
        public virtual ICollection<AreaPincode> AreaPincode { get; set; }
        public virtual District District { get; set; }
    }
}

私のViewModelクラス

 public class CityViewModel
    {
        public CityViewModel()
        {
            this.AreaPincode = new List<AreaPincodeViewModel>();
        }

        public long ID { get; set; }
        public string Name { get; set; }
        public int DistrictID { get; set; }
        public ICollection<AreaPincodeViewModel> AreaPincode { get; set; }

    }

このプロパティをマップしようとすると、ICollection プロパティが 1 つあるため、次のエラーが表示されます

The following property on MCQ.ViewModels.AreaPincodeViewModel cannot be mapped:
AreaPincode
Add a custom mapping expression, ignore, add a custom resolver, or modify the destination type MCQ.ViewModels.AreaPincodeViewModel.
Context:
Mapping to property AreaPincode from MCQ.Domain.Models.AreaPincode to MCQ.ViewModels.AreaPincodeViewModel
Mapping to property AreaPincode from System.Collections.Generic.ICollection`1[[MCQ.Domain.Models.AreaPincode, MCQ.Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] to System.Collections.Generic.ICollection`1[[MCQ.ViewModels.AreaPincodeViewModel, MCQ, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]
Mapping from type MCQ.Domain.Models.City to MCQ.ViewModels.CityViewModel
Exception of type 'AutoMapper.AutoMapperConfigurationException' was thrown.

Global.asaxに書いた次のコード

    Mapper.CreateMap<City, CityViewModel>()
           .ForMember(s => s.DistrictID, d => d.Ignore())
           .ForMember(s => s.AreaPincode, d => d.MapFrom(t => t.AreaPincode));

オートマッパーを使用してこのカスタム コレクション プロパティをバインドする方法を教えてください。

4

2 に答える 2

2

との間のカスタム マッピングを作成する必要がありAreaPincodeますAreaPincodeViewModel:

Mapper.CreateMap<AreaPincode, AreaPincodeViewModel>()
  .ForMember(...)

そして、この行には必要ありません:.ForMember(s => s.AreaPincode, d => d.MapFrom(t => t.AreaPincode))自動的に一致します

于 2013-03-28T05:39:48.650 に答える
1

にマッピングするときは、型からに変換する必要がありますAreaPincode。つまり、 type のすべての要素を type の要素にマッピングします。CityViewModelICollection<AreaPincode>ICollection<AreaPincodeViewModel>AreaPincodeAreaPincodeViewModel

これを行うには、 からAreaPincodeへの新しいマッピングを作成しAreaPincodeViewModelます。

Mapper.CreateMap<AreaPincode, AreaPincodeViewModel>()
...

これが整ったら、AutoMapper が残りを処理する必要があります。回線すら必要ない

.ForMember(s => s.AreaPincode, d => d.MapFrom(t => t.AreaPincode));

プロパティ名が等しいため、AutoMapper はこのマッピングを自動的に把握するためです。

于 2013-03-28T05:41:44.533 に答える