web-dev-qa-db-fra.com

Automapper manque de configuration de mappe de type ou de mappage non pris en charge?

Modèle d'entité

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

Voir le modèle

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

Carte

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

Et erreur

Configuration de mappe de type manquante ou mappage non pris en charge. Il y a eu beaucoup de changements dans les cartouches

Chemin de destination: Categoies_7314E98C41152985A4218174DDDF658046BC82AB0ED9E1F0440514D79052F84D

Valeur source: NewsCMS.Areas.Admin.Models.CategoriesViewModel

Qu'est-ce que je rate? J'essaie de trouver, mais je ne vois pas le problème.

MISE À JOUR

J'ai spécifié dans application_start dans 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());
    }
}
61
AliRıza Adıyahşi

J'ai trouvé la solution, Merci à tous pour la réponse.

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

Mais, je ne sais déjà pas la raison. Je ne peux pas comprendre pleinement.

4
AliRıza Adıyahşi

Où avez-vous spécifié le code de mappage (CreateMap)? Référence: Où dois-je configurer AutoMapper?

Si vous utilisez la méthode static Mapper, la configuration ne doit avoir lieu qu'une fois par AppDomain. Cela signifie que le meilleur endroit pour insérer le code de configuration est le démarrage de l'application, tel que le fichier Global.asax pour les applications ASP.NET.

Si la configuration n'est pas enregistrée avant d'appeler la méthode Map, vous recevrez Missing type map configuration or unsupported mapping.

54
Martin4ndersen

Dans votre profil de classe AutoMapper, vous devez créer une carte pour votre entité et un modèle de vue.

Mappages de modèles de vue à modèle de domaine:

C'est habituellement dans AutoMapper/DomainToViewModelMappingProfile

Dans Configure(), ajoutez une ligne comme

Mapper.CreateMap<YourEntityViewModel, YourEntity>();

Modèle de domaine vers mappages ViewModel:

Dans ViewModelToDomainMappingProfile, ajoutez:

Mapper.CreateMap<YourEntity, YourEntityViewModel>();

exemple Gist

18
Pierry

Remarquez le Categoies_7314E98C41152985A4218174DDDF658046BC82AB0ED9E1F0440514D79052F84D classe dans l'exception? C'est un proxy Entity Framework. Je vous recommanderais de supprimer votre contexte EF pour vous assurer que tous vos objets sont chargés avec impatience à partir de la base de données et qu'aucun proxy de ce type n'existe:

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

Si la récupération d'entité est effectuée à l'intérieur d'une couche d'accès aux données (ce qui bien sûr est le bon moyen), assurez-vous de disposer de votre contexte EF avant de renvoyer des instances à partir de votre DAL.

18
Darin Dimitrov

Je l'ai fait pour supprimer l'erreur:

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

Vérifiez votre fichier Global.asax.cs et assurez-vous que cette ligne existe

 AutoMapperConfig.Configure();
4
neustart47

Mettez à niveau Automapper vers la version 6.2.2. Ça m'a aidé

0
Anand

Je sais que la question est plutôt ancienne pour l’instant, mais j’avais trouvé la bonne solution, c’était de ne pas déclarer l’attribut Assembly.

Mon code est:

using AutoMapper;
...

namespace [...].Controllers
{
    public class HousingTenureTypesController : LookupController<HousingTenureType, LookupTypeModel>
    {
        Mapper.CreateMap<HousingTenureType, LookupTypeModel>().ReverseMap();
    }
    ...
}

Ceci a été corrigé en ajoutant la ligne suivante avant ma déclaration d'espace de noms:

[Assembly: WebActivatorEx.PreApplicationStartMethod(typeof(HousingTenureTypesController), "AutoMapperStart")]

Le code complet est:

using AutoMapper;
...

[Assembly: WebActivatorEx.PreApplicationStartMethod(typeof(HousingTenureTypesController), "AutoMapperStart")]

namespace [...].Controllers
{
    public class HousingTenureTypesController : LookupController<HousingTenureType, LookupTypeModel>
    {
        Mapper.CreateMap<HousingTenureType, LookupTypeModel>().ReverseMap();
    }
    ...
}
0
Mitchell Schwitzer