讨论一个问题,MVC里面Model类建立问题。
比如一个User类。有ID、Name、Password、Mail、LastLoginData这几个字段,但是不同的地方可能只需要一部分属性,我现在的写法是都是一个Factory类的函数来控制,在不同的属性前面加上判断。如
if(dr.Table.Columns.Contains("Password"))
t.Password=dr["Password"].toString().
这种写法虽然可以不用管从数据库里面取过来的字段有哪些、数据库里面取出来的字段是否存在的问题。但是这个也影响了性能。
我现在想到另外一个想法,方法2:
对不同的User建立不同的Model,比如UserAll【这个是取全部字段的】,UserLogin【登陆只需要取账号和密码和登陆时间】,然后不同的UserModel对应一个Factory。
这样而来就不需要在Factory里面判断从数据库取出来的数据表到底有什么字段了。 最后,大家怎么看?或许大家还有什么好的方法?
建议使用微型orm 例如 dapper 既能满足灵活性 又能使用他的从数据映射到实体的功能
为什么 要 判断 “数据库里面取出来的字段是否存在的问题”
我这边的结构是这样的:
Sql数据库----》SQL存储过程---被操作--》DAL层里面的数据库Factory(复制根据从存储过程获取的数据来创建对应的Model)----提交给-》DAL层里面的数据库repostroy仓库-----提交给---》BLL里面的Service
我这边是不用ORM的,而且我从数据库里面取的东西不是表的全部字段,大多只是一部分字段而已。我要根据这些字段来在Factory类里面判断那些Model的属性是否要赋值上去,因为空值的话会报错的。
@听雨读诗: 相对来说方法2会好点 ,你也可了解一下 AutoMapper
MVC里的Model是Viewmodel,是跟页面相关的,
在控制器里将从数据库里取出来的Model绑定到ViewModel上.
你这样在数据库访问层直接返回Viewmodel会造成所有层的耦合`
也就是你这样做了.分层也就没意义了```
数据库 查都查出来了,还怕多一个字段赋值吗?
给所有的字段赋值,这个实例在各层传输,有啥问题?建很多实体烦,如果是 数据库查出来都是动态列 直接使用dataTable或者是 字典键值对 在各层传输
采用上面的方法1的话,方法1从数据库取出来的字段大部分情况下只是Model的一部分而已,就是所谓的贫血模型,如果要直接把这个贫血模型和原模型配对的话就必须进行判断,也即使判断从数据库取出来的表中有没有对应的字段,比如说有本次查询没有Password这个字段,那如果没有这句话“if(dr.Table.Columns.Contains("Password"))”来判断的话就直接“ t.Password=dr["Password"].toString().”会报错的。
@听雨读诗:
数据库 查出来的字段是动态的,会 不一样,那应该要判断,没必要多建一个实体吧。
@Qlin: 如果要判断的话应该挺耗时间的,毕竟数据表的每一行都要进行扫描。但如果是一个继承基类的Model,只需要直接赋值而不需要判断了。
觉得您想多想复杂了。如果非要如此做,可以考虑继承。建立父类。