オートマッパーにタイプマップ構成がないか、サポートされていないマッピング-エラー


86

エンティティモデル

public partial class Categoies
{
    public Categoies()
    {
        this.Posts = new HashSet<Posts>();
    }

    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public Nullable<int> PositionId { get; set; }

    public virtual CategoryPositions CategoryPositions { get; set; }
    public virtual ICollection<Posts> Posts { get; set; }
}

モデルを見る

public class CategoriesViewModel
{
    public int Id { get; set; }

    [Required(ErrorMessage = "{0} alanı boş bırakılmamalıdır!")]
    [Display(Name = "Kategori Adı")]
    public string Name { get; set; }

    [Display(Name = "Kategori Açıklama")]
    public string Description { get; set; }

    [Display(Name = "Kategori Pozisyon")]
    [Required(ErrorMessage="{0} alanı boş bırakılmamalıdır!")]
    public int PositionId { get; set; }
}

CreateMap

Mapper.CreateMap<CategoriesViewModel, Categoies>()
            .ForMember(c => c.CategoryPositions, option => option.Ignore())
            .ForMember(c => c.Posts, option => option.Ignore());

地図

[HttpPost]
public ActionResult _EditCategory(CategoriesViewModel viewModel)
{
    using (NewsCMSEntities entity = new NewsCMSEntities())
    {
        if (ModelState.IsValid)
        {
            try
            {
                category = entity.Categoies.Find(viewModel.Id);
                AutoMapper.Mapper.Map<CategoriesViewModel, Categoies>(viewModel, category);
                //category = AutoMapper.Mapper.Map<CategoriesViewModel, Categoies>(viewModel);
                //AutoMapper.Mapper.Map(viewModel, category);
                entity.SaveChanges();

                // Veritabanı işlemleri başarılı ise yönlendirilecek sayfayı 
                // belirleyip ajax-post-success fonksiyonuna gönder.
                return Json(new { url = Url.Action("Index") });
            }
            catch (Exception ex)
            {

            }
        }

        // Veritabanı işlemleri başarısız ise modeli tekrar gönder.
        ViewBag.Positions = new SelectList(entity.CategoryPositions.ToList(), "Id", "Name");
        return PartialView(viewModel);
    }
}

エラー

タイプマップ設定がないか、マッピングがサポートされていません。マッピングタイプ:CategoriesViewModel-> Categoies_7314E98C41152985A4218174DDDF658046BC82AB0ED9E1F0440514D79052F84D NewsCMS.Areas.Admin.Models.CategoriesViewModel-> System.Data.Entity.DynamicProxies.Categoies_7314E98C41152985A4218

宛先パス:Categoies_7314E98C41152985A4218174DDDF658046BC82AB0ED9E1F0440514D79052F84D

ソース値:NewsCMS.Areas.Admin.Models.CategoriesViewModel

何が足りないのですか?見つけようとしましたが、問題がわかりません。

更新

Global.asaxのapplication_startで指定しました

protected void Application_Start()
{
    InitializeAutoMapper.Initialize();
}

InitializeClass

public static class InitializeAutoMapper
{
    public static void Initialize()
    {
        CreateModelsToViewModels();
        CreateViewModelsToModels();
    }

    private static void CreateModelsToViewModels()
    {
        Mapper.CreateMap<Categoies, CategoriesViewModel>();
    }

    private static void CreateViewModelsToModels()
    {
        Mapper.CreateMap<CategoriesViewModel, Categoies>()
            .ForMember(c => c.CategoryPositions, option => option.Ignore())
            .ForMember(c => c.Posts, option => option.Ignore());
    }
}

また、異なる名前空間に同じクラス名があるかどうかを再確認してください。したがって、別のオブジェクトを初期化し、別のオブジェクトをマッピングおよびマッピングしている可能性があります
Iman

回答:


66

マッピングコード(CreateMap)はどこで指定しましたか?参照:AutoMapperはどこで構成しますか?

静的マッパーメソッドを使用している場合、構成はAppDomainごとに1回だけ行う必要があります。つまり、構成コードを配置するのに最適な場所は、ASP.NETアプリケーションのGlobal.asaxファイルなどのアプリケーションの起動です。

Mapメソッドを呼び出す前に構成が登録されていない場合は、 Missing type map configuration or unsupported mapping.


2
はい、クラスMapper.CreateMap <IDataReader、UserBo>();を登録する必要があります。
ニッキ

35

あなたのクラスで AutoMapperプロファイルで、エンティティとビューモデルのマップを作成する必要があります。

ViewModelからドメインモデルへのマッピング:

これは通常 AutoMapper/DomainToViewModelMappingProfile

Configure()、のような行を追加します

Mapper.CreateMap<YourEntityViewModel, YourEntity>();

ドメインモデルからViewModelマッピングへ:

ViewModelToDomainMappingProfile、次を追加します。

Mapper.CreateMap<YourEntity, YourEntityViewModel>();

要旨の例


1
ありがとう:)私は寝ていて、それが両方の方法でうまくいくと思っていました、そして注文が重要であることに本当に気づいていませんでした。Profile.CreateMap <TSource、TDestination>()
Kiksen19年

4
@Kiksen Mapper.CreateMap<YourEntityViewModel, YourEntity>().ReverseMap(); .ReverseMap()を使用すると、双方向で機能するようになり、その場合は順序について心配する必要もありません。
PramilGawande19年

20

Categoies_7314E98C41152985A4218174DDDF658046BC82AB0ED9E1F0440514D79052F84D例外のクラスに注意してください。これはEntityFrameworkプロキシです。すべてのオブジェクトがデータベースから熱心にロードされ、そのようなプロキシが存在しないことを確認するために、EFコンテキストを破棄することをお勧めします。

[HttpPost]
public ActionResult _EditCategory(CategoriesViewModel viewModel)
{
    Categoies category = null;
    using (var ctx = new MyentityFrameworkContext())
    {
        category = ctx.Categoies.Find(viewModel.Id);
    }
    AutoMapper.Mapper.Map<CategoriesViewModel, Categoies>(viewModel, category);
    //category = AutoMapper.Mapper.Map<CategoriesViewModel, Categoies>(viewModel, category);
    entity.SaveChanges();
}

エンティティの取得がデータアクセス層内で実行される場合(もちろんこれは正しい方法です)、DALからインスタンスを返す前にEFコンテキストを破棄するようにしてください。


これは自動的に行われますか、それともAutomapperにマップする必要があるもの(自動以外のもの)を知らせる必要がありますか?
brumScouse 2013

1
マッピングを構成する必要があります。また、カスタムマッピングルールが必要な場合は、それらのルールを記述します。
ダリン・ディミトロフ

ありがとうございました。どういうわけか、オートマッパーのセクションを完全にスキップしました。
brumScouse 2013

その正しい、実際には、編集メソッドの取得と投稿、取得:ドメインモデルからViewModelマッピング、および投稿:ViewModelからドメインモデルマッピングのマップを作成する必要があります。これを確認してください。誰かが役立つことを願っています。
Shaiju T 2016

7

私はエラーを取り除くためにこれをしました:

Mapper.CreateMap<FacebookUser, ProspectModel>();
prospect = Mapper.Map(prospectFromDb, prospect);

5

私は解決策を見つけました、返信をありがとう。

category = (Categoies)AutoMapper.Mapper.Map(viewModel, category, typeof(CategoriesViewModel), typeof(Categoies));

しかし、私はすでにその理由を知りません。完全には理解できません。


問題の原因を見つけましたか?
Saturn Technologies

16
多分それはそのタイプミス「Categoies」です
ジョーフィリップス

5

Global.asax.csファイルをチェックして、この行がそこにあることを確認してください

 AutoMapperConfig.Configure();

3

.NetCoreでも同じ問題が発生しました。私の基本のdtoクラス(オートマッパーアセンブリのスタートアップのタイプとして指定します)は別のプロジェクトにあったためです。Automapperは、基本クラスプロジェクトでプロファイルを検索しようとしました。しかし、私のdtoは別のプロジェクトにありました。基本クラスを移動しました。そして問題は解決しました。これは一部の人に役立つかもしれません。


2

これは今のところかなり古い質問ですが、適切な解決策は、アセンブリ属性を宣言していないことであることがわかりました。

私のコードは:

using AutoMapper;
...

namespace [...].Controllers
{
    public class HousingTenureTypesController : LookupController<HousingTenureType, LookupTypeModel>
    {
        Mapper.CreateMap<HousingTenureType, LookupTypeModel>().ReverseMap();
    }
    ...
}

これは、名前空間宣言の前に次の行を追加することで修正されました。

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(HousingTenureTypesController), "AutoMapperStart")]

完全なコードは次のとおりです。

using AutoMapper;
...

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(HousingTenureTypesController), "AutoMapperStart")]

namespace [...].Controllers
{
    public class HousingTenureTypesController : LookupController<HousingTenureType, LookupTypeModel>
    {
        Mapper.CreateMap<HousingTenureType, LookupTypeModel>().ReverseMap();
    }
    ...
}

1

私の場合、マップを作成しましたが、ReverseMap関数がありませんでした。それを追加すると、エラーがなくなりました。

      private static void RegisterServices(ContainerBuilder bldr)
      {
         var config = new MapperConfiguration(cfg =>
         {
            cfg.AddProfile(new CampMappingProfile());
         });
         ...
       }


      public CampMappingProfile()
      {
         CreateMap<Talk, TalkModel>().ReverseMap();
         ...
      }

1

IEnumerableをオブジェクトにマップしようとしていました。これが私がこのエラーを受け取った方法です。多分それは役立ちます。


-1

Automapperをバージョン6.2.2にアップグレードします。それは私を助けました


-1

新しいAutomapperProfileクラスを作成しました。プロファイルを拡張します。私たちのソリューションには100を超えるプロジェクトがあります。多くのプロジェクトにはAutomapperProfileクラスがありますが、これはこの既存のプロジェクトにとって新しいものです。しかし、私はこの問題を解決するために何をしなければならないかを見つけました。バインディングプロジェクトがあります。初期化には次のコードがあります。

var mappingConfig = new List<Action<IConfiguration>>();

// Initialize the Automapper Configuration for all Known Assemblies
mappingConfig.AddRange( new List<Action<IConfiguration>>
{
   ConfigureProfilesInAssemblyOfType<Application.Administration.AutomapperProfile>,
   //...

ConfigureProfilesInAssemblyOfType < MyNewNamespace.AutomapperProfile>を追加する必要がありました

ConfigureProfilesInAssemblyOfTypeは次のようになっていることに注意してください。

    private static void ConfigureProfilesInAssemblyOfType<T>( IConfiguration configuration )
    {
        var log = LogProvider.Get( typeof (AutomapperConfiguration) );

        // The Automapper Profile Type
        var automapperProfileType = typeof (Profile);

        // The Assembly containing the type
        var assembly = typeof (T).Assembly;
        log.Debug( "Scanning " + assembly.FullName );

        // Configure any Profile classes found in the assembly containing the type.
        assembly.GetTypes()
            .Where( automapperProfileType.IsAssignableFrom ).ToList()
            .ForEach( x =>
            {
                log.Debug( "Adding Profile '" + x.FullName + "'" );
                configuration.AddProfile( Activator.CreateInstance( x ) as Profile );
            } );
    }

よろしく、-ジェフ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.