Ответ 1
Я нашел решение, спасибо всем за ответ.
category = (Categoies)AutoMapper.Mapper.Map(viewModel, category, typeof(CategoriesViewModel), typeof(Categoies));
Но я уже не знаю причины. Я не могу полностью понять.
Модель сущности
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_7314E98C41152985A4218174DDDF658046BC82AB0ED9E1F0440514D79052F84D
Путь назначения: Categoies_7314E98C41152985A4218174DDDF658046BC82AB0ED9E1F0440514D79052F84D
Исходное значение: NewsCMS.Areas.Admin.Models.CategoriesViewModel
Что мне не хватает? Я пытаюсь найти, но я не вижу проблемы.
ОБНОВИТЬ
Я указал в application_start в Global.asax
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?
Если вы используете статический метод Mapper, настройка должна происходить только один раз для каждого AppDomain. Это означает, что лучшее место для размещения кода конфигурации - это запуск приложения, например, файл Global.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
вам необходимо создать карту для вашей сущности и модели просмотра.
Обычно это AutoMapper/DomainToViewModelMappingProfile
В Configure()
добавьте строку типа
Mapper.CreateMap<YourEntityViewModel, YourEntity>();
В ViewModelToDomainMappingProfile
добавьте:
Mapper.CreateMap<YourEntity, YourEntityViewModel>();
Я сделал это, чтобы удалить ошибку:
Mapper.CreateMap<FacebookUser, ProspectModel>();
prospect = Mapper.Map(prospectFromDb, prospect);
Проверьте файл Global.asax.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();
}
...
}
Обновите Automapper до версии 6.2.2. Это помогло мне