有个问题纠结很久了,在网上搜索、群里讨论,找了些源码 最后都没结果,希望得到各位的指点。问题描述较长,请耐心看完哈!
典型的一对多关系
商品类:Goods 商品类别:GoodsCls
思路一:
在Goods类中有个属性:public string GoodsClsID{ get; set; }
直接是Goods这个类中通过这个属性关联到该商品的分类。
问题1:感觉不OO,软件中类与类的关系体现得不明显,客户端(如:UI层)在获取关联属性的时候又要去查一次数据库,这样感觉不是在写程序,而是在写SQL语句,比如 在前台获取一个商品类的列表,然后绑定到TreeView上,然后点击一个节点获取一个对应分类下的商品列表时,所获取的列表与这个商品分类 根本没有任何连系,只是单纯的通过ClsID去获取一个表。
思路二:
在Goods类中有个属性:public GoodsCls Cls{ get; set; } 直接关联到一个 商品分类的实体
同时在GoodsCls类中有个属性:public List<Goods> ListGoods{ get; set; } 直接关联到一个 商品集合
这是我觉得理想的做法,我也相信都应该这么做。客户端首先获得或者创建一个商品。只要.(点一下)就可以获得他的分类信息。同理,当获得或者创建一个商品分类的时候 只要点一下 就可以获得该类别下面的商品信息列表。
问题2:
当我将一个商品添加进一个列表的时候 应该是
Goods goods1 = ..... ; // 获取或者实例化一个商品
goods1.Cls = goodscls1; //设置商品的 分类属性,意思是把一个商品加入到 某个分类
当我做goods1.Cls=goodscls1的时候,goodscls1.List<Goods>应该自动加入goods1
意思就是当我 把一个商品加入到某个分类的时候,对应的商品分类的 商品集合里 应该自动的 加入这个商品
反过来说 当我 在一个商品分类的商品集合属性中加入一个商品时,被加入的这个商品的 商品分类 属性应该自动的等于 这个商品分类。这里有点绕。。希望您看明白了!
首先这里出现了循环该如何解决呢?
再者一个软件系统中有 实体间有大量的这种关系。有没有好的办法来维护这样的关系。
简单三层中 这样的关系维护何时处理? 在那一层处理? 关系太复杂了。
我考虑过在实体的get方法中去触发一个事件,然后在创建或者获取这个实体的时候去处理它的事件来实现延迟加载。比如在 bll层中 根据ID获取一个商品的时候 绑定事件 调用GoodsClsBll的GetModelByID的方法去获取关联的商品类别 实体,但是同理 在 GoodsCls类中 又要引用GoodsBll类的GetListByCls方法去获取某一个商品类别的列表。出现循环引用了又怎么办呢。。