AutoMapper Model To ViewModel Vice Versa 更新记录

Posted

技术标签:

【中文标题】AutoMapper Model To ViewModel Vice Versa 更新记录【英文标题】:AutoMapper Model To ViewModel Vice Versa Updating Record 【发布时间】:2011-08-05 06:56:48 【问题描述】:

我有一个单元测试,我使用映射器从 Model 到 ViewModel,然后 ViewModel 返回到 Model 更新记录 - 但实际上我没有更改任何内容,只是测试更新是否有效。

        [TestMethod]
    public void UpdateEntry()
    
        //Map Model to ViewModel
        Mapper.CreateMap<GlobalExport, GlobalExportViewModel>();
        Mapper.CreateMap<FileNameSetup, FileNameSetupViewModel>();
        Mapper.CreateMap<FileNameVariable, FileNameVariableViewModel>();
        Mapper.CreateMap<EmailSetup, EmailSetupViewModel>();
        Mapper.CreateMap<SelectedSection, SelectedSectionViewModel>();
        Mapper.CreateMap<AvailableSection, AvailableSectionViewModel>();
        Mapper.CreateMap<AvailableColumn, AvailableColumnViewModel>();
        Mapper.CreateMap<Policy, PolicyViewModel>();
        Mapper.CreateMap<SelectedColumn, SelectedColumnViewModel>();
        Mapper.CreateMap<SelectedEmployeeSeaServiceType, SelectedEmployeeSeaServiceTypeViewModel>();
        Mapper.CreateMap<SelectedEmployeeStatus, SelectedEmployeeStatusViewModel>();
        Mapper.CreateMap<EmployeeStatus, EmployeeStatusViewModel>();
        Mapper.CreateMap<EmployeeSubStatus, EmployeeSubStatusViewModel>();
        Mapper.CreateMap<SelectedEmployeeSubStatus, SelectedEmployeeSubStatusViewModel>();
        Mapper.CreateMap<SelectedSeaServiceType, SelectedSeaServiceTypeViewModel>();


        GlobalExport globalExport = _service.GetGlobalExportById(1);
        GlobalExportViewModel globalExportViewModel = Mapper.Map<GlobalExport, GlobalExportViewModel>(globalExport);

        //Map ViewModel to Model
        Mapper.CreateMap<GlobalExportViewModel, GlobalExport>();
        Mapper.CreateMap<FileNameSetupViewModel, FileNameSetup>();
        Mapper.CreateMap<FileNameVariableViewModel, FileNameVariable>();
        Mapper.CreateMap<EmailSetupViewModel, EmailSetup>();
        Mapper.CreateMap<SelectedSectionViewModel, SelectedSection>();
        Mapper.CreateMap<AvailableSectionViewModel, AvailableSection>();
        Mapper.CreateMap<AvailableColumnViewModel, AvailableColumn>();
        Mapper.CreateMap<PolicyViewModel, Policy>();
        Mapper.CreateMap<SelectedColumnViewModel, SelectedColumn>();
        Mapper.CreateMap<SelectedEmployeeSeaServiceTypeViewModel, SelectedEmployeeSeaServiceType>();
        Mapper.CreateMap<SelectedEmployeeStatusViewModel, SelectedEmployeeStatus>();
        Mapper.CreateMap<EmployeeStatusViewModel, EmployeeStatus>();
        Mapper.CreateMap<EmployeeSubStatusViewModel, EmployeeSubStatus>();
        Mapper.CreateMap<SelectedEmployeeSubStatusViewModel, SelectedEmployeeSubStatus>();
        Mapper.CreateMap<SelectedSeaServiceTypeViewModel, SelectedSeaServiceType>();

        GlobalExport newGlobalExport = Mapper.Map<GlobalExportViewModel, GlobalExport>(globalExportViewModel);
        _service.UpdateGlobalExport(newGlobalExport);

    

我收到此错误:

有人可以给出一些意见或更好的解决方案吗:P 非常感谢!

【问题讨论】:

【参考方案1】:

这里的问题是GlobalExportRepository.UpdateGlobalExport 方法试图将GlobalExport 对象附加到检索它的同一DbContext 实例。

尝试修改GlobalExportRepository.UpdateGlobalExport 方法以将实体显式标记为已修改,然后只需调用DbContext.SaveChanges 方法即可。

这是一个例子:

public void UpdateGlobalExport(GlobalExport instance)

    var entity = context.Entry(instance);
    entity.State = EntityState.Modified;        
    context.SaveChanges();

GlobalExport 实例will automatically be detected even if its state is Detached 所做的任何更改。

【讨论】:

我会调查并回复您。非常感谢! 很抱歉,返回的状态等于EntityState.Detached,所以错误仍然存​​在:(如果我将条件更改为反转“!entity.State”会发生什么? @Badz 尝试完全删除对DbSet.Attach 方法的调用。请参阅我的更新答案。 @Badz 你在哪一行得到异常? 我在这部分遇到了异常 - context.SaveChanges();现在好了,我的同事已经解决了。感谢您的麻烦

以上是关于AutoMapper Model To ViewModel Vice Versa 更新记录的主要内容,如果未能解决你的问题,请参考以下文章

使用AutoMapper实现Dto和Model的自由转换(下)

AutoMapper完成Dto与Model的转换

AutoMapper的使用

AutoMapper

使用AutoMapper实现Dto和Model的自由转换(上)

C#console app与DB first Entity Framework和AutoMapper,无法将Model转换为DbModel