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 Новости.Области.Администратор.Модели.CategoriesViewModel - > Система.Данные.Сущность.Динамические процессы.Categoies_7314E98C41152985A4218174dddf658046bc82ab0ed9e1f0440514d79052f84d
пути назначения : Categoies_7314E98C41152985A4218174dddf658046bc82ab0ed9e1f0440514d79052f84d
исходное значение: Новости.Области.Администратор.Модели.CategoriesViewModel
что я упустил? Я пытаюсь найти, но я не вижу проблемы.
обновление
Я указал в 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());
}
}
спасибо.
8 ответов:
где вы указали код отображения (CreateMap)? Ссылка: где я могу настроить AutoMapper?
Если вы используете метод статического сопоставления, конфигурация должна выполняться только один раз для каждого домена приложения. Это означает, что лучшее место для размещения кода конфигурации-это запуск приложения,например глобальный.файл asax для ASP.NET приложения.
если конфигурация не зарегистрирована перед вызовом метода Map, вы получите
Missing type map configuration or unsupported mapping.
обратите внимание на
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(); }
Если извлечение сущности выполняется внутри уровня доступа к данным (что, конечно, является правильным способом), убедитесь, что вы размещаете свой контекст EF перед возвратом экземпляров из вашего DAL.
в свой класс
AutoMapper
профиль, вам нужно создать карту для вашего объекта и viewmodel.ViewModel Для Сопоставления Модели Домена:
это, как правило, в
AutoMapper/DomainToViewModelMappingProfile
на
Configure()
добавить строкуMapper.CreateMap<YourEntityViewModel, YourEntity>();
Модели Предметной Области Модель Представления Отображений:
на
ViewModelToDomainMappingProfile
добавить:Mapper.CreateMap<YourEntity, YourEntityViewModel>();
Я сделал это, чтобы устранить ошибку:
Mapper.CreateMap<FacebookUser, ProspectModel>(); prospect = Mapper.Map(prospectFromDb, prospect);
Я нашел решение, Спасибо всем за ответ.
category = (Categoies)AutoMapper.Mapper.Map(viewModel, category, typeof(CategoriesViewModel), typeof(Categoies));
но, я уже не знаю причину. Я не могу понять полностью.
проверьте свой глобальный.асакс.cs файл и убедитесь, что эта строка будет там
AutoMapperConfig.Configure();
Я знаю, что это довольно старый вопрос на данный момент, но я нашел правильное решение, что я не объявлял атрибут сборки.
мой код:
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(); } ... }