2013-06-09 8 views
5

このエラーが発生する例はたくさんありますが、さまざまな原因が考えられますが、このエラーが実際に何を意味しているのかについていくつかの情報を与えることができるかどうか疑問に思っています。ここではいくつかのコードは次のとおりです。AutoMapperをデバッグする方法「タイプマップの設定が欠落しているか、サポートされていないマッピング」エラー

コントローラー:

[HttpPost] 
    public ActionResult Edit(ProfileViewModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      var person = new UserAttribute(); 

      person = Mapper.Map<ProfileViewModel, UserAttribute>(model); 

      db.UserAttribute.Add(person); 
      db.SaveChanges(); 

     } 

ビューモデル

public class ProfileViewModel 
{ 

    [Display(Name = "First Name")] 
    [StringLength(20)] 
    [Required] 
    public string FirstName { get; set; } 

    [Display(Name = "Last Name")] 
    [StringLength(30)] 
    [Required] 
    public string LastName { get; set; } 

    [Display(Name = "Gender")] 
    [Required] 
    public string Gender { get; set; } 

    [Display(Name = "Date of Birth")] 
    [DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}", ApplyFormatInEditMode = true)] 
    public DateTime DOB { get; set; } 

    [Display(Name = "Hair Color")] 
    public string HairColor { get; set; } 

    [Display(Name = "Eye Color")] 
    public string EyeColor { get; set; } 

    [Display(Name = "Body Type")] 
    public string Weight { get; set; } 

    [Display(Name = "Height")] 
    public string HeightFeet { get; set; } 

    public string HeightInches { get; set; } 

    public int UserId { get; set; } 

    public IEnumerable<SelectListItem> WeightList { get; set; } 
    public IEnumerable<SelectListItem> EyeColorList { get; set; } 
    public IEnumerable<SelectListItem> HairColorList { get; set; } 
    public IEnumerable<SelectListItem> HeightFeetList { get; set; } 
    public IEnumerable<SelectListItem> HeightInchesList { get; set; } 
    public IEnumerable<SelectListItem> GenderList { get; set; } 

} 

UserAttributeモデル:

public int ProfileId { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Gender { get; set; } 
    public System.DateTime DOB { get; set; } 
    public string HairColor { get; set; } 
    public string EyeColor { get; set; } 
    public string HeightFeet { get; set; } 
    public string Weight { get; set; } 
    public int UserId { get; set; } 
    public string HeightInches { get; set; } 

マッピングの設定:

public class AutoMapperConfiguration 
{ 
    public static void Configure() 
    { 
     Mapper.Initialize(x => x.AddProfile<ViewToDomainMapProfile>()); 
     Mapper.Initialize(x => x.AddProfile<DomainToViewMapProfile>()); 
    } 
} 

public class ViewToDomainMapProfile : Profile 
{ 
    public override string ProfileName 
    { 
     get { return "ViewToDomainMapProfile"; } 
    } 

    protected override void Configure() 
    { 
     Mapper.CreateMap<ProfileViewModel, UserAttribute>() 
      .ForSourceMember(x => x.GenderList, y => y.Ignore()) 
      .ForSourceMember(x => x.HairColorList, y => y.Ignore()) 
      .ForSourceMember(x => x.EyeColorList, y => y.Ignore()) 
      .ForSourceMember(x => x.WeightList, y => y.Ignore()) 
      .ForSourceMember(x => x.HeightFeetList, y => y.Ignore()) 
      .ForSourceMember(x => x.HeightInchesList, y => y.Ignore()); 
    } 
} 

と設定は、グローバルasaxに呼び出されますのviewmodel => userattribute

については

 AutoMapperConfiguration.Configure(); 
+0

これはコンパイルエラーまたはランタイムエラーですか?また、viewmodelマッピングへのドメインは正しく機能しますか? – user1778606

答えて

0

私は、プロファイルIDは、ソースプロパティ、宛先プロパティではなく、ことに気づきました。

public int ProfileId { get; set; } 

この宛先メンバーを配備するコードを追加する必要がありますか?

その他: オートマッペを使用してカスタマイズすると、名前の一致するもののみを表示するプロパティをマップすることもできます。

可能であれば、実際にはほとんどの場合、実際の属性にのみ使用されている慣習として、Attritributeという単語で終わるモデル名は避けてください。 (つべこべのための私の謝罪が)

10

Mapper.AssertConfigurationIsValid();を使用するには、次の例外が生成されますので、

AutoMapper.AutoMapperConfigurationException : 
Unmapped members were found. Review the types and members below. 
Add a custom mapping expression, ignore, add a custom resolver, or modify the source/destination type 
============================================================================================== 
ProfileViewModel -> UserAttribute (Destination member list) 
---------------------------------------------------------------------------------------------- 
ProfileId 

を、あなたはProfileIdのマッピングを追加する必要があります。

全体として、Mapper.AssertConfigurationIsValid();を単体テスト(あなたが持っていますか?)か、マッパー設定後に使用することをお勧めします。このような誤った設定に関する詳細情報が表示されます。

+0

これは私を救った。追加するだけです。 Mapper.AssertConfigurationIsValid();私のglobal.asaxマッピング内の は、私のマッピングで同じ名前の別のクラスを使用していたことがわかりました。 (それは大したことではないので無視してください、それはレガシーなコードです)すべてのメンバーのマッピングが見つからない場合、Mapper.Map()はエラーをスローしません。マップしようとすると失敗します。 –

+0

誰かがこの回答に同意する必要があります –

関連する問題