【问题标题】:ASP.NET MVC2 Posting a ViewModel mapping to Domain (LINQ) to Submitting changesASP.NET MVC2 将 ViewModel 映射到域 (LINQ) 以提交更改
【发布时间】:2010-07-27 19:55:40
【问题描述】:

我正在使用 AutoMapper 在 Linq Domain 对象和 ViewModel 之间进行映射,以向用户显示一个完美运行的编辑表单。

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

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

我在尝试:

  1. 使用 UpdateModel 构建我的自定义视图模型
  2. 使用传入的id获取Linq实体之前的状态
  3. 将视图模型映射到 Linq 实体(使用自动映射器)
  4. 在数据上下文中调用 SubmitChanges()

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

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

【问题讨论】:

    标签: asp.net-mvc-2 viewmodel automapper


    【解决方案1】:

    我采用的方法与 Jimmy Bogard 在 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;
        }
    }
    

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

    【讨论】:

    • 谢谢,我仔细查看了codecampserver.codeplex.com,从中可以学到很多东西。我选择了与您的建议类似的方法,感谢您为我指明了正确的方向。
    猜你喜欢
    • 1970-01-01
    • 2017-07-06
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多