112

实体模型

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

创建地图

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

我错过了什么?我试图找到,但我看不到问题。

更新

我在 Global.asax 的 application_start 中指定

protected void Application_Start()
{
    InitializeAutoMapper.Initialize();
}

初始化类

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

13 回答 13

72

您在哪里指定了映射代码(CreateMap)?参考:我在哪里配置 AutoMapper?

如果您使用的是静态 Mapper 方法,则每个 AppDomain 只应进行一次配置。这意味着放置配置代码的最佳位置是在应用程序启动中,例如用于 ASP.NET 应用程序的 Global.asax 文件。

如果在调用 Map 方法之前没有注册配置,您将收到Missing type map configuration or unsupported mapping.

于 2013-02-03T22:48:08.783 回答
42

在您的类AutoMapper配置文件中,您需要为您的实体和视图模型创建一个映射。

ViewModel 到域模型映射:

这通常在AutoMapper/DomainToViewModelMappingProfile

Configure()中,添加一行

Mapper.CreateMap<YourEntityViewModel, YourEntity>();

域模型到 ViewModel 映射:

ViewModelToDomainMappingProfile中,添加:

Mapper.CreateMap<YourEntity, YourEntityViewModel>();

要点示例

于 2014-11-13T11:54:18.113 回答
22

注意Categoies_7314E98C41152985A4218174DDDF658046BC82AB0ED9E1F0440514D79052F84D异常中的类?那是一个实体框架代理。我建议您处理您的 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();
}

如果实体检索是在数据访问层内执行的(这当然是正确的方法),请确保在从 DAL 返回实例之前处置 EF 上下文。

于 2013-02-03T23:10:36.557 回答
10

我试图将 IEnumerable 映射到对象。这就是我得到这个错误的方式。也许它有帮助。

于 2020-11-05T18:23:27.793 回答
9

我这样做是为了消除错误:

Mapper.CreateMap<FacebookUser, ProspectModel>();
prospect = Mapper.Map(prospectFromDb, prospect);
于 2013-07-22T22:16:46.390 回答
7

我在 .Net Core 中遇到了同样的问题。因为我的基础 dto 类(我将它作为 automapper 程序集的启动类型)在不同的项目中。Automapper 试图在基类项目中搜索配置文件。但我的 dto 在不同的项目中。我移动了我的基类。并且问题解决了。这可能对某些人有所帮助。

于 2020-09-05T20:43:19.540 回答
6

我找到了解决方案,谢谢大家的回复。

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

但是,我已经不知道原因了。我无法完全理解。

于 2013-02-03T23:35:11.313 回答
6

检查您的 Global.asax.cs 文件并确保该行存在

 AutoMapperConfig.Configure();
于 2015-10-20T13:14:25.910 回答
4

就我而言,我创建了地图,但缺少 ReverseMap 函数。添加它消除了错误。

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


      public CampMappingProfile()
      {
         CreateMap<Talk, TalkModel>().ReverseMap();
         ...
      }
于 2020-10-08T14:19:32.003 回答
3

我知道这是一个相当古老的问题,但我发现正确的解决方案是我没有声明程序集属性。

我的代码是:

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();
    }
    ...
}
于 2015-06-12T00:16:48.283 回答
1

从 AutoMapper v.3 更新到 v.5 后,我们遇到了同样的错误。

最终我们发现目标类具有类型为 IDictionary<string, object> 的 Property,并且在同一类型的 Profile 映射中是有效的。

有下一个可能的解决方案:

  1. 更新到更高版本。在 v.6 中,该错误消失了。
  2. 或者忽略映射中的那个道具。
  3. 或者使用方法Mapper.Map<IFooDto>(foo) instead of Mapper.Map(foo, fooDto).

我们的配置文件就像使用接口作为目标:

public class FooProfile : Profile
{
    public FooProfile()
    {
        CreateMap<Foo, IFooDto>()
            .ConstructUsing(foo => new FooDto());
    }
}

另外我应该提到,在从 v.3 更新到更高版本的过程中,与旧版本相比,我们遇到了许多错误和差异,以及对我们有帮助的:

  • 每次检查下一个版本是否会修复错误;
  • 仔细检查现有的映射配置。它可能有旧的隐藏错误,例如在没有设置器的情况下映射到属性或现有的重复映射等。并且可能是旧版本允许这样做,而新版本则不允许。
于 2021-11-15T11:43:26.527 回答
0

将 Automapper 升级到版本 6.2.2。它帮助了我

于 2017-12-21T12:41:19.043 回答
-1

我创建了一个新的 AutomapperProfile 类。它扩展了 Profile。我们的解决方案中有 100 多个项目。许多项目都有一个 AutomapperProfile 类,但这个对于现有项目来说是新的。但是,我确实找到了必须做的事情来为我们解决这个问题。有一个绑定项目。在初始化中有以下代码:

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

最好的问候,-杰夫

于 2019-09-16T20:37:56.003 回答