Automapper thiếu cấu hình bản đồ loại hoặc ánh xạ không được hỗ trợ - Lỗi


81

Mô hình thực thể

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

Xem mô hình

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

Bản đồ

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

lỗi

Thiếu cấu hình bản đồ loại hoặc ánh xạ không được hỗ trợ. Các loại ánh xạ: Danh mụcXemModel -> Categoies_7314E98C41152985A4218174DDDF658046BC82AB0ED9E1F0440514D79052F84D NewsCMS.Areas.Admin.Models.CategoriesViewModel -> System.Data.Entity.DynamicProxies1882

Đường dẫn đích: Categoies_7314E98C41152985A4218174DDDF658046BC82AB0ED9E1F0440514D79052F84D

Giá trị nguồn: NewsCMS.Areas.Admin.Models.CategoriesViewModel

Tôi đang thiếu gì? Tôi cố gắng tìm, nhưng tôi không thấy vấn đề.

CẬP NHẬT

Tôi đã chỉ định trong application_start trong 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());
    }
}

cũng Kiểm tra kỹ xem bạn có cùng tên lớp trong không gian tên khác nhau hay không. vì vậy có khả năng bạn đang khởi tạo đối tượng khác nhau và ánh xạ và ánh xạ đối tượng khác nhau
Iman

Câu trả lời:


66

Bạn đã chỉ định mã ánh xạ (CreateMap) ở đâu? Tham khảo: Tôi cấu hình AutoMapper ở đâu?

Nếu bạn đang sử dụng phương thức Bản đồ tĩnh, cấu hình chỉ nên thực hiện một lần cho mỗi AppDomain. Điều đó có nghĩa là nơi tốt nhất để đặt mã cấu hình là khi khởi động ứng dụng, chẳng hạn như tệp Global.asax cho các ứng dụng ASP.NET.

Nếu cấu hình chưa được đăng ký trước khi gọi phương thức Bản đồ, bạn sẽ nhận được Missing type map configuration or unsupported mapping.


2
có, bạn phải đăng ký lớp Mapper.CreateMap <IDataReader, UserBo> ();
Nikki

32

Trong AutoMapperhồ sơ lớp học của mình , bạn cần tạo bản đồ cho thực thể và mô hình xem của mình.

ViewModel To Domain Model Maps:

Điều này thường ở AutoMapper/DomainToViewModelMappingProfile

Trong Configure(), thêm một dòng như

Mapper.CreateMap<YourEntityViewModel, YourEntity>();

Mô hình miền để xem ánh xạ mô hình:

Trong ViewModelToDomainMappingProfile, thêm:

Mapper.CreateMap<YourEntity, YourEntityViewModel>();

Ví dụ chính


1
Cảm ơn bạn :) Tôi đã ngủ và nghĩ rằng nó chỉ hoạt động theo cả hai cách, và không thực sự nhận ra rằng việc đặt hàng là quan trọng. Profile.CreateMap <TSource, TDestination> ()
Kiksen,

3
@Kiksen .ReverseMap Mapper.CreateMap<YourEntityViewModel, YourEntity>().ReverseMap(); () sẽ làm cho nó hoạt động theo cả hai cách và bạn thậm chí không phải lo lắng về thứ tự trong trường hợp đó.
Pramil Gawande

20

Lưu ý Categoies_7314E98C41152985A4218174DDDF658046BC82AB0ED9E1F0440514D79052F84Dlớp trong ngoại lệ? Đó là một proxy Framework thực thể. Tôi khuyên bạn nên loại bỏ ngữ cảnh EF của mình để đảm bảo rằng tất cả các đối tượng của bạn đều được tải nhanh chóng từ cơ sở dữ liệu và không tồn tại những proxy như vậy:

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

Nếu quá trình truy xuất đối tượng được thực hiện bên trong lớp truy cập dữ liệu (tất nhiên là cách chính xác), hãy đảm bảo rằng bạn loại bỏ ngữ cảnh EF trước khi trả lại các phiên bản từ DAL của bạn.


Điều này được thực hiện tự động hay chúng ta cần cho Automapper biết những gì nó phải ánh xạ (bất cứ thứ gì trừ tự động)?
brumScouse

1
Bạn cần phải định cấu hình các ánh xạ. Và đối với những người bạn muốn quy tắc ánh xạ tùy chỉnh, hãy viết các quy tắc đó.
Darin Dimitrov

Cảm ơn bạn. Tôi đã hoàn toàn bỏ qua phần trên trình tự động làm thế nào để..cách nào đó.
brumScouse

Đúng, Thực ra chúng ta phải tạo Bản đồ cho Get và Post of Edit Method , cho Get Its: Domain Model To ViewModel Mappings và Post Its: ViewModel To Domain Model Mappings, hãy kiểm tra cái này , hy vọng sẽ giúp được ai đó.
shaijut

7

Tôi đã làm điều này để xóa lỗi:

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

5

Tôi đã tìm thấy giải pháp, Cảm ơn tất cả đã trả lời.

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

Nhưng, tôi đã không biết lý do. Tôi không thể hiểu đầy đủ.


Bạn đã tìm ra nguyên nhân của vấn đề chưa?
Saturn Technologies

16
Có thể đó là lỗi đánh máy "Categoies"
Joe Phillips

5

Kiểm tra tệp Global.asax.cs của bạn và đảm bảo rằng dòng này ở đó

 AutoMapperConfig.Configure();

2

Tôi biết đây là một câu hỏi khá cũ cho đến bây giờ, nhưng tôi đã tìm ra giải pháp thích hợp là tôi đã không khai báo thuộc tính assembly.

Mã của tôi là:

using AutoMapper;
...

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

Điều này đã được khắc phục bằng cách thêm dòng sau trước khai báo không gian tên của tôi:

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

Mã đầy đủ là:

using AutoMapper;
...

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

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

2

Tôi đã gặp vấn đề tương tự trong .Net Core. Bởi vì lớp dto cơ sở của tôi (tôi đặt nó như một loại khi khởi động cho lắp ráp tự động) nằm trong dự án khác. Automapper đã cố gắng tìm kiếm các cấu hình trong dự án lớp cơ sở. Nhưng dto của tôi ở trong một dự án khác. Tôi đã chuyển lớp cơ sở của mình. Và vấn đề đã được giải quyết. Điều này có thể giúp ích cho một số người.


1

Trong trường hợp của tôi, tôi đã tạo bản đồ, nhưng thiếu chức năng ReverseMap. Thêm nó đã loại bỏ lỗi.

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


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

1

Tôi đang cố gắng ánh xạ IEnumerable với một đối tượng. Đây là cách tôi gặp lỗi này. Có lẽ nó sẽ giúp.


-1

Nâng cấp Automapper lên phiên bản 6.2.2. Nó đã giúp đỡ tôi


-1

Tôi đã tạo một lớp AutomapperProfile mới. Nó mở rộng Hồ sơ. Chúng tôi có hơn 100 dự án trong giải pháp của mình. Nhiều dự án có lớp AutomapperProfile, nhưng lớp này là mới đối với dự án hiện có này. Tuy nhiên, tôi đã tìm thấy những gì tôi phải làm để khắc phục sự cố này cho chúng tôi. Có một dự án Ràng buộc. Trong phần Khởi tạo có mã này:

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

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

Tôi đã phải thêm ConfigureProfilesInAssemblyOfType < MyNewNamespace .AutomapperProfile>

Lưu ý rằng ConfigureProfilesInAssemblyOfType trông giống như sau:

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

Trân trọng, -Jeff

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.