web-dev-qa-db-ja.com

Automapperにタイプマップ設定がないか、マッピングがサポートされていませんか?

エンティティモデル

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_7314E98C41152985A4218174D8565804658465826582804826582658265D810282DD826582804DD85F80465DD80402102FDD6510274DD82D8102FDD65F8465DD84F82405A82218D8F82D6510F74E85F085F045F045D8F45D74F1F04405F1)

宛先パス:Categoies_7314E98C41152985A4218174DDDF658046BC82AB0ED9E1F0440514D79052F84D

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

私は何が欠けていますか?見つけようとしましたが、問題が見つかりません。

UPDATE

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());
    }
}
61

解決策を見つけました。返信ありがとうございます。

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

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

4

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

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

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

54
Martin4ndersen

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

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

これは通常AutoMapper/DomainToViewModelMappingProfileにあります

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

Mapper.CreateMap<YourEntityViewModel, YourEntity>();

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

ViewModelToDomainMappingProfileに以下を追加します。

Mapper.CreateMap<YourEntity, YourEntityViewModel>();

要旨の例

18
Pierry

例外のCategoies_7314E98C41152985A4218174DDDF658046BC82AB0ED9E1F0440514D79052F84Dクラスに注目してください。これは、Entity Frameworkプロキシです。すべてのオブジェクトがデータベースから積極的にロードされ、そのようなプロキシが存在しないようにするために、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コンテキストを破棄してください。

18
Darin Dimitrov

私はこれをしてエラーを削除しました:

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

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

 AutoMapperConfig.Configure();
4
neustart47

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

0
Anand

これは今のところかなり古い質問ですが、適切な解決策は、Assembly属性を宣言していないということです。

私のコードは:

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();
    }
    ...
}
0