У програмі автоматичного програмування відсутня конфігурація карти типу або непідтримуване відображення - Помилка


86

Модель сутності

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

також перевірте, чи є у вас однакова назва класу в іншому просторі імен. отже, є ймовірність того, що ви ініціалізуєте різний об’єкт і
Іман

Відповіді:


66

Де ви вказали код відображення (CreateMap)? Довідка: Де я можу налаштувати AutoMapper?

Якщо ви використовуєте статичний метод Mapper, конфігурація повинна відбуватися лише один раз для AppDomain. Це означає, що найкраще місце для встановлення коду конфігурації - при запуску програми, наприклад, файл Global.asax для програм ASP.NET.

Якщо конфігурація не буде зареєстрована перед викликом методу Map, ви отримаєте Missing type map configuration or unsupported mapping.


2
так, вам потрібно зареєструвати свій клас Mapper.CreateMap <IDataReader, UserBo> ();
Ніккі

35

У своєму AutoMapperпрофілі класу вам потрібно створити карту для вашої сутності та модель перегляду.

ViewModel До зіставлення моделі домену:

Зазвичай це в AutoMapper/DomainToViewModelMappingProfile

У Configure()додайте рядок

Mapper.CreateMap<YourEntityViewModel, YourEntity>();

Модель домену для перегляду зіставлення моделей:

В ViewModelToDomainMappingProfile, додайте:

Mapper.CreateMap<YourEntity, YourEntityViewModel>();

Приклад суті


1
Дякую :) Я спав і думав, що це просто працює в обох напрямках, і насправді не усвідомлював, що замовлення важливо. Profile.CreateMap <TSource, TDestination> ()
Кіксен,

4
@Kiksen Mapper.CreateMap<YourEntityViewModel, YourEntity>().ReverseMap(); .ReverseMap () змусить його працювати в обидві сторони, і вам навіть не доведеться турбуватися про порядок у такому випадку.
Праміл Гаванде,

20

Помітили 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, що він має відобразити (що є чим завгодно, крім автоматичного)?
brumScouse

1
Вам потрібно налаштувати відображення. А для тих, кому потрібні власні правила зіставлення, напишіть ці правила.
Дарін Димитров

Дякую. Я повністю пропустив розділ про автомат, як .. як-небудь.
brumScouse

Правильно, насправді ми маємо створити карту для методу отримання та публікації редагування , для функції «Отримати її: модель домену для перегляду зіставлення моделі» та для публікації її: Перегляд моделі відображення моделі домену, перевірте це , сподіваємось, хтось допомагає.
Shaiju T

7

Я зробив це, щоб видалити помилку:

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

5

Я знайшов рішення, дякую усім за відповідь.

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

Але, я вже не знаю причини. Я не можу зрозуміти повністю.


Ви знайшли причину проблеми?
Saturn Technologies

16
Можливо, це та помилка "Categoies"
Джо Філліпс,

5

Перевірте файл Global.asax.cs і переконайтесь, що цей рядок є там

 AutoMapperConfig.Configure();

3

У мене була така ж проблема в .Net Core. Оскільки мій базовий клас dto (я даю його як тип під час запуску для збірки automapper) був в іншому проекті. Automapper намагався шукати профілі в проекті базового класу. Але мої dto були в іншому проекті. Я переніс свій базовий клас. І проблема вирішена. Це може допомогти деяким особам.


2

Я знаю, що це досить давнє запитання на сьогодні, але я знайшов правильне рішення в тому, що я не оголошував атрибут збірки.

Мій код:

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

1

У моєму випадку я створив карту, але мені не вистачало функції ReverseMap. Додавши його, ми позбулися помилки.

      private static void RegisterServices(ContainerBuilder bldr)
      {
         var config = new MapperConfiguration(cfg =>
         {
            cfg.AddProfile(new CampMappingProfile());
         });
         ...
       }


      public CampMappingProfile()
      {
         CreateMap<Talk, TalkModel>().ReverseMap();
         ...
      }

1

Я намагався зіставити IEnumerable з об'єктом. Таким чином я отримав цю помилку. Можливо, це допомагає.



-1

Я створив новий клас AutomapperProfile. Це розширює профіль. У нашому рішенні понад 100 проектів. У багатьох проектах є клас AutomapperProfile, але цей був новим для цього існуючого проекту. Однак я знайшов, що мені потрібно було зробити, щоб вирішити цю проблему для нас. Існує проект Binding. В рамках Ініціалізації є такий код:

var mappingConfig = new List<Action<IConfiguration>>();

// Initialize the Automapper Configuration for all Known Assemblies
mappingConfig.AddRange( new List<Action<IConfiguration>>
{
   ConfigureProfilesInAssemblyOfType<Application.Administration.AutomapperProfile>,
   //...

Мені довелося додати ConfigureProfilesInAssemblyOfType < MyNewNamespace .AutomapperProfile>

Зверніть увагу, що ConfigureProfilesInAssemblyOfType виглядає так:

    private static void ConfigureProfilesInAssemblyOfType<T>( IConfiguration configuration )
    {
        var log = LogProvider.Get( typeof (AutomapperConfiguration) );

        // The Automapper Profile Type
        var automapperProfileType = typeof (Profile);

        // The Assembly containing the type
        var assembly = typeof (T).Assembly;
        log.Debug( "Scanning " + assembly.FullName );

        // Configure any Profile classes found in the assembly containing the type.
        assembly.GetTypes()
            .Where( automapperProfileType.IsAssignableFrom ).ToList()
            .ForEach( x =>
            {
                log.Debug( "Adding Profile '" + x.FullName + "'" );
                configuration.AddProfile( Activator.CreateInstance( x ) as Profile );
            } );
    }

З найкращими побажаннями, Джефе

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.