将数据库模型从实体映射到viewmodel

时间:2017-04-18 11:23:18

标签: c# asp.net entity-framework automapper

我是使用automapper的新手,我想在我的项目中实现它。我试图将多个模型从EF映射到asp项目中的单个视图模型,但在此之前我遇到了如下问题。 enter image description here

我尝试按照以下方式提供解决方案:

  1. Automapper missing type map configuration or unsupported mapping
  2. Automapper missing type map configuration or unsupported mapping?
  3. 但没有任何成功。 我正在使用最近的automapper。 我尝试了方法的变化来创建地图,如

        config.CreateMap<tblMeeting, MeetingViewModels>()
                .ForMember(dest => dest.meetingDetails, input => input.MapFrom(i => new tblMeeting
                {
                    meetingId = i.meetingId,
                    meetingType = i.meetingType??null,
                    startTime = i.startTime,
                    finishTime = i.finishTime,
                    meetingDate = i.meetingDate,
                    meetingNotes = i.meetingNotes,
                    meetingVenue = i.meetingVenue
                }));
    

    和这个

                config.CreateMap<tblMeeting, MeetingViewModels>()
               .ForMember(dest => dest.meetingDetails.meetingId, opt => opt.MapFrom(s => s.meetingId))
                .ForMember(dest => dest.meetingDetails.startTime,
                            opt => opt.MapFrom((s => s.startTime)))
                .ForMember(dest => dest.meetingDetails.finishTime,
                            opt => opt.MapFrom(s => s.finishTime))
                .ForMember(dest => dest.meetingDetails.meetingType,
                            opt => opt.MapFrom(s => s.meetingType ?? null))
    
                .ForMember(dest => dest.meetingDetails.meetingDate,
                            opt => opt.MapFrom(s => s.meetingDate))
                .ForMember(dest => dest.meetingDetails.meetingVenue,
                            opt => opt.MapFrom(s => s.meetingVenue))
                .ForMember(dest => dest.meetingDetails.meetingNotes,
                            opt => opt.MapFrom(s => s.meetingNotes));
    
    
            });
    

    这也是

                 config.CreateMap<tblMeeting, MeetingViewModels>().ConvertUsing<test();
    
        public class test : ITypeConverter<tblMeeting, MeetingViewModels>
        {
    
    
            public MeetingViewModels Convert(tblMeeting source, MeetingViewModels destination, ResolutionContext context)
            {
                MeetingViewModels m = new MeetingViewModels();
    
                m.meetingDetails.meetingId = Guid.Parse(source.meetingType.ToString());
                m.meetingDetails.meetingNotes = source.meetingNotes;
                m.meetingDetails.meetingType = Guid.Parse(source.meetingType.ToString());
                m.meetingDetails.meetingDate = source.meetingDate;
                m.meetingDetails.startTime = source.startTime;
                m.meetingDetails.finishTime = source.finishTime;
                m.meetingDetails.meetingVenue = source.meetingVenue;
    
                    return m;
            }
        }
    

    但非可以解决问题。 如果有人能帮助我,那将是非常有帮助的。 谢谢。

1 个答案:

答案 0 :(得分:3)

以下是我在项目中亲自实施AutoMapper的方式:

首先创建一个MappingConfig类,通常我将它放在App_Code文件夹中。

在我的项目中,我可能在系统中有不同的部分,按部分我的意思是不同Areas或者某种程度上应用程序需要在User ManagementMeetings等不同部分进行逻辑分隔。无论你有什么......

因此,从我可以在逻辑部分划分系统的那一刻起,我为每个部分创建了一个配置文件类:

以下是个人资料类的示例:

public class GeneralMappingConfigProfile : Profile
{ 
    public GeneralMappingConfigProfile()
    {
        CreateMap<sourceObject, destinationObject>()
                .ForMember(d => d.X, o => o.MapFrom(s => s.Y))
    }
}

上面的类是一般映射的示例,但如果它足够大,可以将其区分为一个部分,那么您可能会有一个会议配置文件类。

然后在我的配置类中,我配置所有配置文件类如下:

public class MappingConfig
{
    public static void RegisterMappings()
    {
        Mapper.Initialize(config =>
        {
            config.AddProfile<GeneralMappingConfigProfile>(); 
            config.AddProfile<MeetingsMappingConfigProfile>();
            //etc
        });
    }
}

global.asax我调用静态方法如下:

MappingConfig.RegisterMappings();

然后我可以在每个配置文件中创建尽可能多的映射:

我刚刚编写了所有这些代码,因此您可以更好地组织代码......

对于您的情况,可能会有很多可能导致此错误的事情,但请参阅此问题here。你能不能在这里分享更多的代码,因为我希望看到MeetingViewModels模型和动作代码,因为从数据库中获取tblMeeting对象的方式一定有问题。