使用Castle.ActiveRecord的注意事项之二:级联

      根据数库的设计,有密切联系的对象的增加,删除,修改设置级联操作,在使用中会有很大的便利但是也有些需要注意的地方。之前的项目使用,为了避免不必要的麻烦,一律设置成了不级联操作。后面对象的使用时,很多地方多写了多余重复的代码。其实,在使用前根据对象的属性,设计好级联操作,能带来很大的便利。本文从多对多,和一对多两个方面,并针对数据库设计中主外键的属性来分析对象的级联。
       由于学习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:在增加和更新的时候做级联操作
 
posted @ 2008-10-29 14:18  clarkapp  阅读(351)  评论(0编辑  收藏  举报