ViewModel称为页面实体
Model为数据库实体
其实没有什么连接起来的,主要是做一个实体间数据的相互转换,以控制器A,action为Create为例
public ActionResult Create(ViewModelA model){ //这里接收的是页面模型
//第一步将页面模型转为数据库模型
var entity = model.ToEntity();
//再进行插入就行
_aServices.Insert(entity);
}
ToEntity哪里来的呢?这里应用到了AutoMapper进行实体映射转换
第一步:在系统初始化的时候(你可以放在application_start或者别的地方)就做上关系映射
Mapper.CreateMap<A, ViewModelA>();
Mapper.CreateMap<ViewModelA, A>();
然后做一个静态的扩展方法方法
public static TDestination MapTo<TSource, TDestination>(this TSource source)
{
return Mapper.Map<TSource, TDestination>(source);
}
public static TDestination MapTo<TSource, TDestination>(this TSource source, TDestination destination)
{
return Mapper.Map(source, destination);
}
//上面两个通用
主要是下面的
public static A ToEntity(this ViewModelA model)
{
return model.MapTo<BtnModel, A>();
}
public static A ToEntity(this ViewModelA model, A entity)
{
return model.MapTo<ViewModelA , A>(entity);
}
public static ViewModelA ToModel(this A model)
{
return model.MapTo<A, ViewModelA >();
}
基本上以上这么多就可以做两个实体间的相互转换了,其实就是会用AotoMapper就行!
好的,我去查查怎么用的
欸。。我问了半天DTO也没人回我
ViewModel就是根据需求写Model,比如说你要写一个注册的Model,
单独建一个RegisterViewModel,这个里面只有两个属性
1.用户名 2.密码 (3.确认 密码->如果有的话)
这里和实体类的区别就是,第三个确认密码只是用来作为MVC验证用的(加特性标签),不会存储起来
如果你写一个查询学生的表格页面可以这样写ViewModel:
1.Id
2.Name
3.班级Id
4.班级名(PO实体类的学生实体里面的是班级导航属性,这里只需要展示班级名所以只写班级名字,)
大概就是这个意思,ViewModel的数据不会持久化存储,应该是从UI层传入BLL层以后再转换成DO/PO啥的 反正就是转换成实体然后再存入数据库。反之亦然
可以使用DTO代替VO在某些情况下,DTO可以使用AutoMapper进行实体映射转换
不过也不太方便,反正新加一层多了很多工作量。。
这样数据安全性高了。
dto,AutoMapper
好的,我去查查怎么用的