您的位置:首页 > 其它

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

2008-10-29 14:18 639 查看
根据数库的设计,有密切联系的对象的增加,删除,修改设置级联操作,在使用中会有很大的便利但是也有些需要注意的地方。之前的项目使用,为了避免不必要的麻烦,一律设置成了不级联操作。后面对象的使用时,很多地方多写了多余重复的代码。其实,在使用前根据对象的属性,设计好级联操作,能带来很大的便利。本文从多对多,和一对多两个方面,并针对数据库设计中主外键的属性来分析对象的级联。
[align=left] 由于学习Castle是从TerryLee的博文中开始,采用他老人家的习惯举例,以向他老人家致敬^_^[/align]
[align=left][/align]
[align=left]1、一对多[/align]
[align=left] 假设一个博客有多个帖子,即一个Blog对应多个Post,权且称Blog为父对象,Post为子对象[/align]
[align=left] 一对多的级联有几种方式 [/align]

[align=left]Cascade=ManyRelationCascadeEnum.None [/align]

[align=left]Cascade=ManyRelationCascadeEnum.All[/align]
[align=left]Cascade=ManyRelationCascadeEnum.AllDeleteOrphan[/align]
[align=left]Cascade=ManyRelationCascadeEnum.SaveUpdate[/align]
[align=left]Cascade=ManyRelationCascadeEnum.Delete[/align]

[align=left] 意思都比较好理解:[/align]
[align=left]NONE:完全不做级联操作[/align]
[align=left] 在增加一个Blog,同时这个Blog含有Post的时候,需要先增加Post,然后增加Blog对象。否则报[/align]
[align=left] object references an unsaved transient instance - save the transient instance before flushing: 错误[/align]
[align=left] 假设一个Blog对象BlogA含有PostB和PostC,现在修改BlogA,移除PostC,并增加PostD(数据库中已经存在),并把PostD的名字修改为PostE。执行BlogA.Update(),执行结果是数据库中PostC对应BlogA的外键设置为了空,PostD还是PostD,没有修改[/align]
[align=left] 可见NONE的级联方式下,执行Update方法是只修改对象本身的内容和子对象的外键内容。子对象的其他字段不做修改。[/align]
[align=left]ALL:增删改都做级联操作[/align]
[align=left]ALLDELETEORPHAN:都做级联操作,并且删除孤儿数据。即删除没有对应BLOG的POST对象[/align]
[align=left]SaveUpdate:在增加和更新的时候做级联操作[/align]
[align=left] [/align]
[align=left]本文原于2008年03月21日 23:57:00发表在http://blog.csdn.net/appgqp/[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: