Подтвердить что ты не робот

Автоматическая конфигурация конфигурации отсутствующего типа или неподдерживаемое отображение?

Модель сущности

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

Ответ 1

Я нашел решение, спасибо всем за ответ.

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

Но я уже не знаю причины. Я не могу полностью понять.

Ответ 2

Где вы указали код сопоставления (CreateMap)? Ссылка: Где я могу настроить AutoMapper?

Если вы используете статический метод Mapper, настройка должна происходить только один раз для каждого AppDomain. Это означает, что лучшее место для размещения кода конфигурации - это запуск приложения, например, файл Global.asax для приложений ASP.NET.

Если конфигурация не зарегистрирована до вызова метода Map, вы получите Missing type map configuration or unsupported mapping.

Ответ 3

Обратите внимание на класс 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.

Ответ 4

В вашем классе AutoMapper вам необходимо создать карту для вашей сущности и модели просмотра.

Сопоставление модели ViewModel To Domain:

Обычно это AutoMapper/DomainToViewModelMappingProfile

В Configure() добавьте строку типа

Mapper.CreateMap<YourEntityViewModel, YourEntity>();

Модель домена для сопоставлений ViewModel:

В ViewModelToDomainMappingProfile добавьте:

Mapper.CreateMap<YourEntity, YourEntityViewModel>();

Пример Gist

Ответ 5

Я сделал это, чтобы удалить ошибку:

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

Ответ 6

Проверьте файл Global.asax.cs и убедитесь, что эта строка находится там

 AutoMapperConfig.Configure();

Ответ 7

Я знаю, что это довольно старый вопрос, но я нашел подходящее решение, что я не объявлял атрибут сборки.

Мой код:

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

Ответ 8

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