Asp.net mvc 2 ASP.NET MVC2将ViewModel映射到域(LINQ)以提交更改

Asp.net mvc 2 ASP.NET MVC2将ViewModel映射到域(LINQ)以提交更改,asp.net-mvc-2,viewmodel,automapper,Asp.net Mvc 2,Viewmodel,Automapper,我使用AutoMapper在Linq域对象和ViewModel之间进行映射,以向用户显示一个编辑表单,这非常有效 当他们单击submit时,我想知道将ViewModel映射回Linq实体并将其持久化到数据库的最佳方法 我使用的Linq实体有多个其他实体的集合(即一对多引用) 我试着: 使用更新模型建立我的自定义视图模型 使用传入的id获取Linq实体的上一个状态 将视图模型映射到Linq实体(使用automapper) 在数据上下文上调用SubmitChanges() 当我只更新不是集合的属性,

我使用AutoMapper在Linq域对象和ViewModel之间进行映射,以向用户显示一个编辑表单,这非常有效

当他们单击submit时,我想知道将ViewModel映射回Linq实体并将其持久化到数据库的最佳方法

我使用的Linq实体有多个其他实体的集合(即一对多引用)

我试着:

  • 使用更新模型建立我的自定义视图模型
  • 使用传入的id获取Linq实体的上一个状态
  • 将视图模型映射到Linq实体(使用automapper)
  • 在数据上下文上调用SubmitChanges()
  • 当我只更新不是集合的属性,但试图修改属于集合的属性时抛出错误时,此方法有效


    任何帮助/想法都将不胜感激:)

    我采用了一种非常类似于Jimmy Bogard在codecamp服务器项目中使用的方法()

    我有一个通用的Mapper类,我从中继承,我只需要重写一个MapToModel方法,该方法从ViewModel映射到域模型,还有一个GetIdFromViewModel方法,该方法从ViewModel返回正确的Id,以便服务层可以从数据库中获取域模型

    我不得不对codecamp服务器示例做一些更改,因为我的一些模型使用Guid,而一些模型使用int作为模型的Id

    您应该能够从上面的codeplex链接中获取代码,这将帮助您朝着这个方向前进

    以下是我的一个会员映射器的外观:

    public class MemberMapper : AutoFormMapper<Member, MemberFormViewModel, Guid>, IMemberMapper
    {
        public MemberMapper(IMemberService service) : base(service) { }
    
        protected override Guid GetIdFromViewModel(MemberFormViewModel viewModel)
        {
            return viewModel.MemberId;
        }
    
        protected override void MapToModel(MemberFormViewModel viewModel, Member model)
        {
            // if the need arises, we will need to map the full objects as Foreign Key properties
            //  by using the proper repositories
            //  right now for loading the object to save back to the DB we don't have that need, so let's not waste the call
    
            model.MemberId = viewModel.MemberId;
            model.FirstName = viewModel.FirstName;
            model.LastName = viewModel.LastName;
            model.Title = viewModel.Title;
            model.EmailAddress = viewModel.EmailAddress;
            model.DirectPhone = viewModel.DirectPhone;
            model.MobilePhone = viewModel.MobilePhone;
            model.ElectronicId = viewModel.ElectronicId;
            model.ProjectRoleTypeId = viewModel.ProjectRoleTypeId;
            model.DepartmentId = viewModel.DepartmentId;
        }
    }
    
    公共类成员映射器:AutoFormMapper、IMemberMapper
    {
    公共成员映射器(IMemberService服务):基本(服务){}
    受保护的覆盖Guid GetIdFromViewModel(MemberFormViewModel viewModel)
    {
    返回viewModel.MemberId;
    }
    受保护的替代无效映射模型(MemberFormViewModel、viewModel、成员模型)
    {
    //如果需要,我们需要将完整对象映射为外键属性
    //通过使用适当的存储库
    //现在,对于加载要保存回DB的对象,我们没有这种需要,所以我们不要浪费调用
    model.MemberId=viewModel.MemberId;
    model.FirstName=viewModel.FirstName;
    model.LastName=viewModel.LastName;
    model.Title=viewModel.Title;
    model.EmailAddress=viewModel.EmailAddress;
    model.DirectPhone=viewModel.DirectPhone;
    model.MobilePhone=viewModel.MobilePhone;
    model.ElectronicId=viewModel.ElectronicId;
    model.ProjectRoleTypeId=viewModel.ProjectRoleTypeId;
    model.DepartmentId=viewModel.DepartmentId;
    }
    }
    

    然后可以使用此MemberMapper映射两个方向。它使用AutoMapper从域模型转到视图模型,然后使用您实现的MapToModel方法从视图模型映射回域模型。

    我采用的方法与CodeCampServer项目中Jimmy Bogard使用的方法非常相似()

    我有一个通用的Mapper类,我从中继承,我只需要重写一个MapToModel方法,该方法从ViewModel映射到域模型,还有一个GetIdFromViewModel方法,该方法从ViewModel返回正确的Id,以便服务层可以从数据库中获取域模型

    我不得不对codecamp服务器示例做一些更改,因为我的一些模型使用Guid,而一些模型使用int作为模型的Id

    您应该能够从上面的codeplex链接中获取代码,这将帮助您朝着这个方向前进

    以下是我的一个会员映射器的外观:

    public class MemberMapper : AutoFormMapper<Member, MemberFormViewModel, Guid>, IMemberMapper
    {
        public MemberMapper(IMemberService service) : base(service) { }
    
        protected override Guid GetIdFromViewModel(MemberFormViewModel viewModel)
        {
            return viewModel.MemberId;
        }
    
        protected override void MapToModel(MemberFormViewModel viewModel, Member model)
        {
            // if the need arises, we will need to map the full objects as Foreign Key properties
            //  by using the proper repositories
            //  right now for loading the object to save back to the DB we don't have that need, so let's not waste the call
    
            model.MemberId = viewModel.MemberId;
            model.FirstName = viewModel.FirstName;
            model.LastName = viewModel.LastName;
            model.Title = viewModel.Title;
            model.EmailAddress = viewModel.EmailAddress;
            model.DirectPhone = viewModel.DirectPhone;
            model.MobilePhone = viewModel.MobilePhone;
            model.ElectronicId = viewModel.ElectronicId;
            model.ProjectRoleTypeId = viewModel.ProjectRoleTypeId;
            model.DepartmentId = viewModel.DepartmentId;
        }
    }
    
    公共类成员映射器:AutoFormMapper、IMemberMapper
    {
    公共成员映射器(IMemberService服务):基本(服务){}
    受保护的覆盖Guid GetIdFromViewModel(MemberFormViewModel viewModel)
    {
    返回viewModel.MemberId;
    }
    受保护的替代无效映射模型(MemberFormViewModel、viewModel、成员模型)
    {
    //如果需要,我们需要将完整对象映射为外键属性
    //通过使用适当的存储库
    //现在,对于加载要保存回DB的对象,我们没有这种需要,所以我们不要浪费调用
    model.MemberId=viewModel.MemberId;
    model.FirstName=viewModel.FirstName;
    model.LastName=viewModel.LastName;
    model.Title=viewModel.Title;
    model.EmailAddress=viewModel.EmailAddress;
    model.DirectPhone=viewModel.DirectPhone;
    model.MobilePhone=viewModel.MobilePhone;
    model.ElectronicId=viewModel.ElectronicId;
    model.ProjectRoleTypeId=viewModel.ProjectRoleTypeId;
    model.DepartmentId=viewModel.DepartmentId;
    }
    }
    

    然后可以使用此MemberMapper映射两个方向。它使用AutoMapper从域模型转到视图模型,然后使用您实现的MapToModel方法从视图模型映射回域模型。

    谢谢,我仔细看了一下,从中可以学到很多东西。我用了一些和你建议的相似的东西,谢谢你给我指出了正确的方向。谢谢,我仔细看了一下,从中可以学到很多东西。我选择了和你建议的相似的东西,谢谢你给我指明了正确的方向。