132 votes

Configuration manquante de la carte de type de l'Automapper ou cartographie non prise en charge - Erreur

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 braklmamaldr!")]
    [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 braklmamaldr!")]
    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 ilemleri baarl ise yönlendirilecek sayfay 
                // belirleyip ajax-post-success fonksiyonuna gönder.
                return Json(new { url = Url.Action("Index") });
            }
            catch (Exception ex)
            {

            }
        }

        // Veritaban ilemleri baarsz ise modeli tekrar gönder.
        ViewBag.Positions = new SelectList(entity.CategoryPositions.ToList(), "Id", "Name");
        return PartialView(viewModel);
    }
}

Error

Configuration de la carte de type manquante ou mappage non pris en charge. Mappage des types : CategoriesViewModel -> Categoies_7314E98C41152985A4218174DDDF658046BC82AB0ED9E1F0440514D79052F84D NewsCMS.Areas.Admin.Models.CategoriesViewModel -> System.Data.Entity.DynamicProxies.Categoies_7314E98C41152985A4218174DDDF658046BC82AB0ED9E1F0440514D79052F84D

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.

UPDATE

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

83voto

Martin4ndersen Points 2268

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

Si vous utilisez la méthode du Mapper statique, la configuration ne doit se faire qu'une fois par AppDomain. Cela signifie que le meilleur endroit pour placer le code de configuration est au démarrage de l'application, comme le fichier Global.asax pour les applications ASP.NET.

Si la configuration n'est pas enregistrée avant l'appel de la méthode Map, vous recevrez le message suivant Missing type map configuration or unsupported mapping.

49voto

Pierry Points 188

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

Mappages entre ViewModel et Domain Model :

Cela se fait généralement en AutoMapper/DomainToViewModelMappingProfile

Sur Configure() ajoutez une ligne comme

Mapper.CreateMap<YourEntityViewModel, YourEntity>();

Mappages entre modèle de domaine et modèle de vue :

Sur ViewModelToDomainMappingProfile , ajoutez :

Mapper.CreateMap<YourEntity, YourEntityViewModel>();

Exemple de Gist

26voto

Darin Dimitrov Points 528142

Remarquez le Categoies_7314E98C41152985A4218174DDDF658046BC82AB0ED9E1F0440514D79052F84D dans l'exception ? C'est un proxy Entity Framework. Je vous recommande de disposer de votre contexte EF pour vous assurer que tous vos objets sont chargés rapidement depuis 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 de l'entité est effectuée à l'intérieur d'une couche d'accès aux données (ce qui est bien sûr la bonne méthode), assurez-vous de disposer de votre contexte EF avant de retourner les instances de votre DAL.

21voto

user3542654 Points 163

J'essayais de faire correspondre un IEnumerable à un objet. C'est ainsi que j'ai obtenu cette erreur. Peut-être que cela vous aidera.

9voto

Sanchitos Points 2263

J'ai fait ça pour supprimer l'erreur :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X