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 56

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

обновление Automapper до версии 6.2.2. Это помогло мне