我只是想知道人们如何处理这种情况.在我使用ORM(MVC)的情况下,这似乎是一个弱点(在这种情况下是NHibernate)…
假设你的模型中有一个细粒度和复杂的实体.您可能会有一个管理页面来管理此类型的对象.如果实体很复杂,那么您不可能以一种形式修改整个实体.您仍然需要将相关属性传递给视图,并在视图返回时将更改合并到模型中的这些属性.
有人在这种情况下做什么?
>创建一个(或包含)实体属性子集的视图模型.通过这个视图.在控制器中的“编辑”操作方法中,从存储库获取对象,然后查看viewmodel中的所有属性,并将其应用于Model对象(model.a = viewmodel.a,modelb = viewmodel.b).这似乎是明显的明智之路,但却产生了大量繁琐的管道代码.此外,这样会使验证复杂一些.
>还有什么?
我已经看了一下automapper – 但这似乎并不适合账单,也许我错了?
谢谢.
解决方法
这听起来像是automapper的完美场景.您创建一个视图模型类,其中包含字段或实际模型的一部分,您可以让AutoMapper将域模型对象中的值提取到视图模型对象中.你有什么问题与这种方法?
考虑这个例子:
这是您的域模型和您的视图模型
- public class Person
- {
- public string FirstName
- { get; set; }
- public string LastName
- { get; set; }
- public string HomeNumber
- { get; set; }
- public string Address1
- { get; set; }
- public string Address2
- { get; set; }
- }
- public class Personviewmodel
- {
- public string FirstName
- { get; set; }
- public string LastName
- { get; set; }
- public string HomeNumber
- { get; set; }
- }
这是您的映射,您必须从dm-> vm和vm-> dm在两个方向创建映射.
使用Automapper时我看到的是,如果将对象A映射到B,并且B具有A没有的属性,则它将被重置.所以当我创建地图我指示它忽略那些缺少的属性.我不是一个Automapper专家,所以我可能会使用它错了.
制图
最后用法:
- Person p = new Person()
- {
- FirstName = "First",LastName = "Last",Address1 = "add 1",Address2 = "add 2"
- };
- Personviewmodel pvm = Mapper.Map<Person,Personviewmodel>(p);
- // Map to a new person
- Person p2 = Mapper.Map<Personviewmodel,Person>(pvm);
- // Map to the existing person just to update it
- Person p3 = new Person()
- {
- HomeNumber = "numberHere"
- };
- // This will update p3
- Mapper.Map<Personviewmodel,Person>(pvm,p3);
由于排除,这显然不如理想,而是比手动做整件事好多了.