我只是想知道人们如何处理这种情况.在我使用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专家,所以我可能会使用它错了.
制图
Mapper.CreateMap<Person,Personviewmodel>(); // Automapper will reset values in dest which don't exist in source,so be sure to ignore them! Mapper.CreateMap<Personviewmodel,Person>() .ForMember(dest => dest.HomeNumber,opt => opt.Ignore());
最后用法:
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);
由于排除,这显然不如理想,而是比手动做整件事好多了.