Asp.net mvc 2 ASP.NET MVC2将ViewModel映射到域(LINQ)以提交更改
我使用AutoMapper在Linq域对象和ViewModel之间进行映射,以向用户显示一个编辑表单,这非常有效 当他们单击submit时,我想知道将ViewModel映射回Linq实体并将其持久化到数据库的最佳方法 我使用的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() 当我只更新不是集合的属性,
任何帮助/想法都将不胜感激:)我采用了一种非常类似于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方法从视图模型映射回域模型。谢谢,我仔细看了一下,从中可以学到很多东西。我用了一些和你建议的相似的东西,谢谢你给我指出了正确的方向。谢谢,我仔细看了一下,从中可以学到很多东西。我选择了和你建议的相似的东西,谢谢你给我指明了正确的方向。