代码之家  ›  专栏  ›  技术社区  ›  Chris

ASP.NET MVC2将视图模型映射发布到域(LINQ)以提交更改

  •  1
  • Chris  · 技术社区  · 16 年前

    我正在使用automapper在Linq域对象和ViewModel之间进行映射,以便向用户显示一个工作正常的编辑表单。

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

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

    我在尝试:

    1. 使用创建自定义视图模型 更新模型
    2. 使用传入的ID获取Linq实体的前一个状态
    3. 将视图模型映射到LINQ实体(使用automapper)
    4. 呼叫 子改变() 在数据上下文中

    当我只更新不是集合的属性,但在尝试修改属于集合的属性时抛出错误时,此方法有效。

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

    1 回复  |  直到 16 年前
        1
  •  1
  •   Jeff Treuting Charlie Martin    16 年前

    我采用了一种非常类似于JimmyBogard在codeCampserver项目中使用的方法。( http://codecampserver.codeplex.com/ )

    我继承了一个普通的mapper类,在这个类中,我只需要重写一个从viewModel映射到域模型的maptoModel方法,以及一个从viewModel返回正确ID的getidFromViewModel方法,以便服务层可以从数据库中获取域模型。

    我不得不对codeCampserver示例做一些修改,因为我的一些模型使用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;
        }
    }
    

    然后可以使用此成员映射器映射两个方向。它使用automapper从域模型转到视图模型,然后使用您实现的maptoModel方法从视图模型映射回域模型。

    推荐文章