エンティティモデル
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());
}
}
解決策を見つけました。返信ありがとうございます。
category = (Categoies)AutoMapper.Mapper.Map(viewModel, category, typeof(CategoriesViewModel), typeof(Categoies));
しかし、私はすでにその理由を知りません。完全に理解できません。
マッピングコード(CreateMap)はどこで指定しましたか?参照: AutoMapperをどこで構成しますか?
静的なマッパーメソッドを使用している場合、構成はAppDomainごとに1回だけ行う必要があります。つまり、構成コードを配置する最適な場所は、ASP.NETアプリケーションのGlobal.asaxファイルなどのアプリケーションの起動時です。
Mapメソッドを呼び出す前に構成が登録されていない場合、Missing type map configuration or unsupported mapping.
を受け取ります
クラスAutoMapper
プロファイルでは、エンティティとビューモデルのマップを作成する必要があります。
これは通常AutoMapper/DomainToViewModelMappingProfile
にあります
Configure()
で、次のような行を追加します
Mapper.CreateMap<YourEntityViewModel, YourEntity>();
ViewModelToDomainMappingProfile
に以下を追加します。
Mapper.CreateMap<YourEntity, YourEntityViewModel>();
例外の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コンテキストを破棄してください。
私はこれをしてエラーを削除しました:
Mapper.CreateMap<FacebookUser, ProspectModel>();
prospect = Mapper.Map(prospectFromDb, prospect);
Global.asax.csファイルを確認し、この行がそこにあることを確認してください
AutoMapperConfig.Configure();
Automapperをバージョン6.2.2にアップグレードします。助けてくれた
これは今のところかなり古い質問ですが、適切な解決策は、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();
}
...
}