日期:2014-05-20  浏览次数:20953 次

关于Model数据实体层,欢迎大家来讨论。
请问大家是如何处理以下问题:

Model是数据库表的实体映射,当系统的需求出现新的变换,例如增加新的功能时数据库需要增加新的字段,
或需要去掉和更换某些旧的功能,那么对应的数据库字段肯定是会修改的。如果数据库的表结构有变换,
对应实体Model层肯定有变换。

改一个字段,
Model层必须要修改,
那么DAL层必须要修改,
SQL语句必须要修改,
表示层的数据展现也是依赖Model层的属性名称,也要修改。
这不符合设计模式的单一职责。牵一发动全身。
并且这样设计,那用啥设计模式都是白搭。
其次工作量非常大,例如商品表的话 光执行查询的地方就不得了。
请问大家是如何处理这种问题,或者怎么把影响降到最低。
------解决方案--------------------
我也有这样的困惑,关注
------解决方案--------------------
其实只需要model变就可以了,其他都可以不用变的,
如增加model的语句,可以根据model的属性来动态生成一个sql语句

public string GetInsertQuery(string prikey, string tableName)
        {
            List<string> fields = new List<string>();
            foreach (PropertyInfo pi in this.GetType().GetProperties())
            {
                fields.Add(pi.Name);
            }
            StringBuilder query = new StringBuilder("insert into " + tableName + "(");
            StringBuilder value = new StringBuilder(" values(");
            int index = 0;
            int count = fields.Count;
            foreach (string key in fields)
            {                
                query.Append(key);
                value.Append(prikey + key);
                if (index < count - 1)
                {
                    query.Append(",");
                    value.Append(",");
                }
                ++index;
            }
            query.Append(")");
            value.Append(")");
            return query.ToString() + value.ToString();
        }

------解决方案--------------------
可使用LINQ
http://topic.csdn.net/u/20090926/11/af162995-f4f8-4660-bed7-3949f047bde3.htmlhttp://topic.csdn.net/u/20100207/09/237128f5-a14a-44e6-a2b3-6920bc6e9538.html
------解决方案--------------------
楼上的方法貌似 根据实体的属性名称来生成各种需要执行的SQL语句?
这也只能减少改动DAO的SQL语句 如果增加了字段。
SqlParameter还是会改变 或者是用存储过程的呢。
有没有符合设计模式原则的解决方法呢?
------解决方案--------------------
更正一下,其实要表达的意思就是 能否对Model层进行抽象 封装变化点。
但Model层可能会随每次需求变更而更改。目的就是想只需变更Model的情况下,不影响引用它的地方。
------解决方案--------------------
没人回答吗?自己顶起来
------解决方案--------------------
请楼主一定坚持下去,楼主提到的问题很好,一个本该在学校就解决的问题,却没有人回答,
楼主如果是负责设计架构的,你可以换一种思维模式,你先把整个架构画出个草图,看着架构问问自己:
1、你的整个构架里为什么会有Model?
   设计Model的动机?难道就是因为书上说要搞Model?
   如果设计这个名叫"Model"的东西是为了所谓的映射数据库、类型化数据集,我认为是与OOD背道而驰的,
   数据本来就是弱类型的、不稳定的,却偏有那么一号人要把这些在项目中描述并且还要“持久化”
2、现有架构里的Model干了什么,达到设计要求了吗?
   从设计角度看:到底是先有的Model还是先有的数据库?
   老师是怎么教UML的?模型驱动,整个开发所有事务都是由模型驱动的,哪个人说是数据库驱动的!
------解决方案--------------------
接7楼:
3、我认为Model不是“实体”,是“模型”,也就是Model的职责是描述整个项目,定义everything,根据OOD的设计原则,Model应该设计成数据无关的,Model的实例可以存放在任何一种形式的DB里,比如XML、Sqlserver、Access、Excel等等,
4、如果需要修改或添加一个字段,那么要做的实际上是对Model的一个实例或者说副本进行修改(请记住刚才说了:不在代码里,在db里),根本不需要修改model的代码,更谈不上修改BLL和UI了;
5、任何一种类似于petshop的架构和类似于codesmith的代码生成器都不是终极生产模式,这些东西只能作为一种过渡的手段使用,那和复制粘贴代码没什么区别,当然我不是说复制粘贴代码不好,恰恰相反,在迈向技术成熟的历程中,我认为复制粘贴越多越好,但是复制粘贴并不是终极目标,只是重构的第一步:让更多的代码无差别;
6、在一个成熟的生产线上,其实是不需要Coder的,极少量的Code由Designer代理了,请注意:不是Coder代理Designer。
------解决方案--------------------
model是整个架构的核心
我就是一菜鸟,个人观点仅供参考,抛砖引玉,那位大侠如果有不同意见请明示
------解决方案--------------------
说了这么多,还没一个人说出实际解决办法,如何降低Model修改对其他层的影响呢?等待CSDN高手解答,自己顶起。
------解决方案--------------------
7楼说的很好。我会坚持下去。
这个问题的确是在学校就该解决了,老师只告诉我们要这样做,这样做是对的,但是为什么呢?有的只说一些大道理 空话来忽悠我们。我们要的是实际
但据我发现 不管是老师讲课或者网上的设计模式都没有讲到过这个问题,
或是在回避这个问题。
看到的所有关于设计模式的文章 博客 书。都是针对某个功能,某个需求来设计。