`
zz8ss5ww6
  • 浏览: 64875 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Castle ActiveRecord中Inverse对Delete的影响

阅读更多
最近在项目中使用Castle ActiveRecord,在使用HasMany定义的关联时出现了无法级联删除的问题。
我在项目中定义了两个实体类FeedEntry和FeedEntryLink如下:
    [ActiveRecord(Table = "FeedEntries")]
    public class FeedEntry : ActiveRecordBase<FeedEntry>
    {
        [PrimaryKey(PrimaryKeyType.GuidComb)]
        public Guid Id { get; set; }

        [Property]
        public string Title { get; set; }

        [Property]
        public string Content { get; set; }

        [Property]
        public DateTime LastUpdatedTime { get; set; }

        [HasMany(Cascade = ManyRelationCascadeEnum.AllDeleteOrphan)]
        public IList<FeedEntryLink> FeedEntryLinks { get; set; }
     }

    [ActiveRecord(Table = "FeedEntryLinks")]
    public class FeedEntryLink : ActiveRecordBase<FeedEntryLink>
    {
        [PrimaryKey(PrimaryKeyType.GuidComb)]
        public Guid Id { get; set; }

        [Property]
        public string RelationshipType { get; set; }

        [Property]
        public string MediaType { get; set; }

        [Property]
        public string Uri { get; set; }

        [BelongsTo("FeedEntryId")]
        public FeedEntry FeedEntry { get; set; }
    }

其中FeedEntry中有一个集合属性FeedEntryLinks定义了它到类FeedEntryLink的一对多关联。而在FeedEntryLink中则有一个FeedEntry属性关联到父类FeedEntry。
在我的应用中需要删除所有的FeedEntry,因此我使用了下面的语句:
FeedEntry.DeleteAll();

看似非常简单的一个语句,执行的时候却报出了下面的错误:

System.Data.SqlClient.SqlException: Cannot insert the value NULL into column 'FeedEntryId', table 'calendar-test.dbo.FeedEntryLinks'; column does not allow nulls. UPDATE fails.
The statement has been terminated.


明明是想删除,可是却试图往外键列中插入NULL,这是为什么呢?
不甘心的我打开sql server profiler,在执行语句FeedEntry.DeleteAll()时监控了生成的sql语句,果然发现出现了如下奇怪的sql:
exec sp_executesql N'UPDATE FeedEntryLinks SET FeedEntryId = null WHERE FeedEntryId = @p0',N'@p0 uniqueidentifier',@p0='7303FFBF-3E3C-4CB3-8ED5-9EF9016BFE0F'


看来真的是在试图插入空值!
经过查验多发资料,发现原来是Inverse惹的祸!
根据nhibernate的官方说明,Inverse属性指定了双向关联中的所有者,它的默认值为false。因此,在我的问题中,默认由关联的“子”方也就是FeedEntryLink来维护关联。
当我需要删除父表中的记录时,维护关联的子表方为了解除关联,就会试图把其所引用的父表设为空,然后再试图删除父表的记录,因此就有了上述生成的奇怪sql语句。
那么如果我把Inverse设置成true呢?比如说我把上面的HasMany改成:
        [HasMany(Cascade = ManyRelationCascadeEnum.AllDeleteOrphan, Inverse = true)]
        public IList<FeedEntryLink> FeedEntryLinks { get; set; }

这个时候再执行删除操作,会生成怎样的sql呢?再次使用sql  server profiler我抓到了如下sql:
exec sp_executesql N'DELETE FROM FeedEntryLinks WHERE Id = @p0',N'@p0 uniqueidentifier',@p0='65EBBCF5-FBA7-4206-8C06-9EF90162559A'

这确实是我期望的删除命令。由于这时候由“父”方负责维护关联,因此当它试图删除父记录时,需要保证所有依赖关联的子记录都已被删除,所以就会执行上面的sql命令。


最后总结一下:Inverse定义了关联的维护方。
(1)当由子方来维护关联时,删除父记录时子记录会试图将关联断开,也就是置空。
(2)当由父方来维护关联时,删除父记录时会试图级联删除子记录。
分享到:
评论

相关推荐

    castle ActiveRecord 源代码

    在深入理解Castle ActiveRecord之前,我们首先要对NHibernate有一个基础的认识。NHibernate是一款强大的开源ORM框架,它允许开发者使用面向对象的方式处理数据库操作,而无需直接编写SQL语句。 Castle ...

    Castle ActiveRecord 最全的入门CHM帮助文档

    9. **Castle API**:CHM 文档中的 "Castle API" 部分可能包含了关于 Castle 库的其他组件,如 Windsor Container(依赖注入容器)和 DynamicProxy(用于创建代理类)的信息,这些都是 Castle ActiveRecord 的基础。...

    Castle ActiveRecord快速入门指南、ActiveRecord帮助文档

    - Castle ActiveRecord 可以通过 NuGet 包管理器在 Visual Studio 中安装,输入 "Castle.ActiveRecord" 即可找到相应的包。 - 确保已经安装了 Castle.Core 和 NHibernate(因为 ActiveRecord 基于 NHibernate 实现...

    简单Castle.ActiveRecord.Generator

    Castle.ActiveRecord.Generator 是一个基于 Castle ActiveRecord 框架的代码生成工具,它极大地简化了在.NET环境中使用ActiveRecord模式进行数据库操作的工作流程。ActiveRecord是面向对象持久化的一个设计模式,将...

    Castle ActiveRecord帮助文档.rar

    Castle ActiveRecord是.NET开发中的一个强大的ORM(对象关系映射)框架,它建立在NHibernate之上,为.NET开发者提供了更高级别的抽象,使得数据库操作更加便捷。这个“Castle ActiveRecord帮助文档.rar”压缩包包含...

    Castle.ActiveRecord 升级NHibernate到3.4.0GA

    Castle.ActiveRecord官方已经停止更新了,官方最高支持到NHibernate 3.1.0.4000,这个版本还有不少问题(例如:[NH-2213] - CLONE -Wrong parameters order in IQuery with SetParameterList and Filter)。...

    Castle ActiveRecord 手册

    这个手册是专为那些想要在.NET环境中利用Castle ActiveRecord进行数据库操作的学习者准备的。以下是对这个框架的一些关键知识点的详细介绍: 1. **ActiveRecord模式**:ActiveRecord模式将业务对象与数据库表映射,...

    Castle ActiveRecord 2.0

    在 Castle ActiveRecord 2.0 版本中,开发者可以更高效地管理数据库操作,而无需编写大量的 SQL 代码。 **1. Castle ActiveRecord 概述** Castle ActiveRecord 提供了一种声明性的方式来定义对象如何映射到数据库表...

    C# Castle.ActiveRecord Winform 源码示例教程

    Castle.ActiveRecord 的资料很多,但是WINFORM...这个例子使用的是ACCESS数据库,从单表,一对多,多对多,数据绑定,HQL查询等多方面解译了Castle.ActiveRecord的基本用法,并付上了Castle.ActiveRecord的API及教程。

    PetShop_Model_DAL.rar_CASTLE_Castle mod_activeRecord_castle d

    Castle ActiveRecord是Castle项目的一个组件,它是对.NET平台上的Hibernate ORM工具的一种轻量级实现。它的核心思想是将对象关系映射(ORM)功能与面向对象设计原则相结合,使得开发者能够使用类似于ActiveRecord...

    C# Castle.ActiveRecord CS源码示例教程.zip

    这个教程主要围绕如何使用 Castle.ActiveRecord 在 C# 项目中实现 ActiveRecord 设计模式,以及通过 Winform 应用来展示其实现过程。 ActiveRecord 是一种设计模式,源自 Ruby on Rails,它将业务对象与数据库记录...

    Castle.ActiveRecord (.NET FrameWork 2.0)

    Castle.ActiveRecord For .NET FrameWork 2.0 如果你想使用Castle.ActiveRecord,但又不想使用.NET Framework 3.0/3.5/4.0或更高版本,那么这个就是你所需要的,For .NET FrameWork 2.0,我整理了好久,自己从官方...

    Wpf使用Castle.ActiveRecord的示例

    Wpf使用Castle.ActiveRecord的示例,Castle针对.NET平台下的一个非常优秀的开源项目,其对数据访问层封装的非常不错,使开发者能省下大量数据访问的工作量,此示例比较基础,适合入门的朋友参考下,所需要的控件已在...

    Castle AR学习文档

    在这个"Castle AR学习文档"中,我们将深入探讨Castle ActiveRecord的核心概念、安装与配置、基本用法以及高级特性。 首先,Castle ActiveRecord的主要目标是将业务对象与数据库表进行映射,减少对SQL的直接依赖,...

    NHibernate中文教程+activerecord

    Castle ActiveRecord是NHibernate ActiveRecord实现的一个版本,提供了额外的功能和方便性。它是一个AOP(面向切面编程)框架,能够自动管理对象的生命周期,包括事务、验证和持久化。 9. **最佳实践** 在实际...

    castle.activerecord

    找这个资源的人都知道这是干什么的,就不多说什么了,

    Castle 例子

    在.NET环境中,Castle ActiveRecord是一个流行的对象关系映射(ORM)框架,它基于NHibernate并提供了对ActiveRecord设计模式的实现。ActiveRecord模式将数据存储的概念与业务对象紧密结合,使得开发者可以更方便地...

    Castle.ActiveRecord NHibernate SQLite NVelocity 组合案例

    Castle.ActiveRecord 3.0.0+NHibernate 3.0.0.4000+SQLite+NVelocity 服务器控件 组合案例 VS环境:VS2010 数据访问框架: Castle.ActiveRecord 3.0.0 + NHibernate3.0.0.4000 当前测试数据库:SQLite (要改变...

    Pro ActiveRecord Databases

    Apress Pro ActiveRecord Databases with Ruby and Rails &lt;br&gt;Active Record has primarily been covered as a subsection, or maybe as a chapter or two, within a larger scoped book generally about the ...

Global site tag (gtag.js) - Google Analytics