项目结束已经有段时间,一直想把这段时间的学习记录发上来,但总是有一些琐事缠身。 今天发了几分简历,顺便把这里补充下。这段时间有几位朋友加了我CSDN好友,在此一并致谢了^_^
根据数库的设计,有密切联系的对象的增加,删除,修改设置级联操作,在使用中会有很大的便利但是也有些需要注意的地方。之前的项目使用,为了避免不必要的麻烦,一律设置成了不级联操作。后面对象的使用时,很多地方多写了多余重复的代码。其实,在使用前根据对象的属性,设计好级联操作,能带来很大的便利。本文从多对多,和一对多两个方面,并针对数据库设计中主外键的属性来分析对象的级联。
由于学习Castle是从TerryLee的博文中开始,采用他老人家的习惯举例,以向他老人家致敬^_^
1、一对多
假设一个博客有多个帖子,即一个Blog对应多个Post,权且称Blog为父对象,Post为子对象
一对多的级联有几种方式
Cascade=ManyRelationCascadeEnum.None
Cascade=ManyRelationCascadeEnum.All
Cascade=ManyRelationCascadeEnum.AllDeleteOrphan
Cascade=ManyRelationCascadeEnum.SaveUpdate
Cascade=ManyRelationCascadeEnum.Delete
意思都比较好理解:
NONE:完全不做级联操作
在增加一个Blog,同时这个Blog含有Post的时候,需要先增加Post,然后增加Blog对象。否则报
object references an unsaved transient instance - save the transient instance before flushing: 错误
假设一个Blog对象BlogA含有PostB和PostC,现在修改BlogA,移除PostC,并增加PostD(数据库中已经存在),并把PostD的名字修改为PostE。执行BlogA.Update(),执行结果是数据库中PostC对应BlogA的外键设置为了空,PostD还是PostD,没有修改
可见NONE的级联方式下,执行Update方法是只修改对象本身的内容和子对象的外键内容。子对象的其他字段不做修改。
ALL:增删改都做级联操作
ALLDELETEORPHAN:都做级联操作,并且删除孤儿数据。即删除没有对应BLOG的POST对象
SaveUpdate:在增加和更新的时候做级联操作
写到这里感觉很多地方如果不用例子代码来说会显得很苍白,也是对自己和大家的不负责任,暂时就写到这里,等补充了代码再来继续写