首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Fluent NHibernate级联删除不起作用

Fluent NHibernate级联删除不起作用
EN

Stack Overflow用户
提问于 2010-10-25 19:02:55
回答 2查看 17.4K关注 0票数 18

我有一个使用Fluent NHibernate 1.1的简单的电话目录应用程序。在应用程序中,一个"Person“对象有许多"PhoneNumber”对象。我正在尝试删除一个人,并且我想将删除操作级联到PhoneNumbers。在阅读了this answer之后,我设置了DefaultCascade.All()的约定。但是,尝试删除父对象仍然会抛出一个异常-- NHibernate似乎正在尝试更新子表,以将父ID设置为null,而不仅仅是删除记录:

{“无法删除集合: Person.PhoneNumbers#473"}

InnerException:

{“无法将值NULL插入到表‘directory.dbo.phone_numbers’的'person_id‘列;列不允许为NULL。更新失败。\r\n该语句已终止。”}

我流利的配置是:

代码语言:javascript
运行
AI代码解释
复制
public static ISessionFactory CreateSessionFactory() {
    return Fluently.Configure()
        .Database(MsSqlConfiguration.MsSql2008
            .ConnectionString(ConfigurationManager.ConnectionStrings[ConfigurationManager.AppSettings["activeConnStr"]].ConnectionString))
        .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Person>()
                                        .Conventions.Add(DefaultCascade.All())
                    )
        .BuildSessionFactory();
}

父类是:

代码语言:javascript
运行
AI代码解释
复制
public class Person {
    public Person() {
        PhoneNumbers = new List<PhoneNumber>();
        EmailAddresses = new List<string>();
    }

    public virtual int Id { get; private set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
    public virtual string Company { get; set; }
    public virtual IList<PhoneNumber> PhoneNumbers { get; set; }
    public virtual IList<string> EmailAddresses { get; set; }
}

子类(PhoneNumber)是:

代码语言:javascript
运行
AI代码解释
复制
public class PhoneNumber {
    public virtual string Number { get; set; }
    public virtual PhoneNumberType NumberType { get; set; }
    public virtual Person Person { get; set; }
}

我删除一个人的代码是:

代码语言:javascript
运行
AI代码解释
复制
public static void DeletePerson(int id) {
    using (var session = Dalc.Instance.SessionFactory.OpenSession()) {
        using (var trans = session.BeginTransaction()) {
            session.Delete(session.Load<Person>(id));
            trans.Commit();
        }
    }
}

我做错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-26 01:28:11

我不确定如何配置Fluent部分,但我最近在使用ActiveRecord时遇到了同样的问题。

您需要将Person端的关联设置为Inverse = true

通过查看Getting Started文档...

我相信,当你亲自定义你的HasMany关系时,你需要设置这个。它应该看起来像这样:

代码语言:javascript
运行
AI代码解释
复制
public PersonMap()
{
    //<...SNIP...>
    HasMany(x => x.PhoneNumbers)
      .Inverse();
    //<...SNIP...>
}
票数 31
EN

Stack Overflow用户

发布于 2012-08-16 05:39:28

它是有效的;下面是每个级联选项的含义:

none -不要做任何级联,让用户自己处理它们。

保存-更新关联-保存/更新对象时,检查关联并保存/更新任何需要它的对象(包括在多对多情况下保存/更新关联)。

删除关联( delete )-删除对象时,删除关联中的所有对象。

孤立删除-孤立-删除对象时,删除关联中的所有对象。除此之外,当一个对象从关联中删除并且不与另一个对象(孤立的)相关联时,也要删除它。

all -保存/更新/删除对象时,检查关联并保存/更新/删除找到的所有对象。

all-delete-orphan -当对象被保存/更新/删除时,检查关联并保存/更新/删除找到的所有对象。除此之外,当一个对象从关联中删除并且不与另一个对象(孤立的)相关联时,也要删除它。

代码语言:javascript
运行
AI代码解释
复制
public class PersonMap : ClassMap<Person>
{
    public PersonMap()
    {
        Table("Person");

        Id(x => x.Id);
        Map(x => x.Name);

        HasMany<PhoneNumber>(x => x.PhoneNumberList)
            .KeyColumn("PersonId")
            .Cascade.All()
            .Inverse().LazyLoad();
    }
}
票数 28
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4017901

复制
相关文章
[原创]Fluent NHibernate之旅
ORM大家都非常熟悉了吧,我相信也有很多朋友正在用自己或者一些公开的框架,而最常用而且强大的,非Hibernate了(Net中为NHibernate),网上的文档非常多,不过在博客园中,介绍NHibernate的非常少,李哥的NHibernate系列(NHibernate之旅)不失为一个经典,对于新手的我们,需要完全掌握还需要很长一段路,对于新手来说,最初的配置是非常头大的一件事情,好在老赵推荐一个开源的框架Fluent NHibernate,有了它,我们可以完全脱离配置文件,不过博客园中介绍Fluent
脑洞的蜂蜜
2018/02/02
1.1K0
[原创]Fluent NHibernate之旅
Fluent NHibernate 之旅 导航篇
ORM大家都非常熟悉了吧,我相信也有很多朋友正在用自己或者一些公开的框架,而最常用而且强大的,非Hibernate了(Net中为NHibernate),网上的文档非常多,不过在博客园中,介绍NHibernate的非常少,李哥的NHibernate系列(NHibernate之旅)不失为一个经典,对于新手的我们,需要完全掌握还需要很长一段路,对于新手来说,最初的配置是非常头大的一件事情,好在老赵推荐一个开源的框架Fluent NHibernate,有了它,我们可以完全脱离配置文件,不过博客园中介绍Fluent
脑洞的蜂蜜
2018/02/02
6840
[原创]Fluent NHibernate之旅(三)-- 继承
经过了“开篇”和“简单映射”两篇文章,相信大家对Fluent NHibernate 有了一定的了解了,FluentNHibernate实际就是对 NHibernate 映射的一定扩展,我们能完全利用强类型、泛型、Lambde表达式等等Vs、Framework等特性简单完成映射工作,同时也能让我们学习NHibernate的映射方式,一举夺得,这么好玩的东东,有理由不继续完成这个系列吗?废话不说,回到正题。 从这一篇开始,我们将使用Fluent NHibernate RC 1.0 版来进行演示,先前的代码,我
脑洞的蜂蜜
2018/02/02
7060
[原创]Fluent NHibernate之旅(三)-- 继承
[原创]Fluent NHibernate之旅(四)-- 关系(下)
最近一直忙着准备去旅行的东东,所以进度慢下来了,明天就要出发了,嘿嘿,在出发前,把多对多给写完吧。如果你第一次看这个系列,可以先看看先前几篇,了解下。 一、开篇:ISessionFactory Configuration 二、实体映射:Entity Mapping 三、继承映射:Inheritence Mapping 四、一对一映射:One-to-One Mapping 五、一对多映射:One-to-Many Mapping 场景和数据库设计 前两篇我们介绍了“一对一”和“一对多(多对一)”,或许前两种用
脑洞的蜂蜜
2018/02/02
7340
[原创]Fluent NHibernate之旅(四)-- 关系(下)
[原创]Fluent NHibernate之旅(四)-- 关系(上)
经过了前面三篇的介绍,相信大家对Fluent NHibernate已经有一定的了解了,在我们学习中,Fluent 也已经进入了RTM版本。这次的版本发布离RC版只有半个月不到,修正了很多bug,同时补充了大量的功能,在每天更新中,也看到了大量的单元测试,我们相信Fluent NHibernate 已经相对稳定成熟了。RTM相对于RC版本来说,使用方法没有太大的变化,所以不做讲解。 我们后面的教程,会使用RTM版本来演示,希望大家能及时更新(点击下载最新版)。 Fluent NHibernate之旅系列导航
脑洞的蜂蜜
2018/02/02
1.2K0
[原创]Fluent NHibernate之旅(四)-- 关系(上)
Fluent NHibernate RC 1.0 --升级内容
Fluent NHiberante(FNT) RC 1.0 已经在上个星期发布了,其中很多东西被废弃,有些方法改进,还有一些命名更贴切,虽说不是很完美,但已经做的非常完善了,如果大家在使用中,发现bug或者没有找到相应的方法,大家可以去 Fluent GoogleGroups 发贴,FNT的作者James Gregory及时回复的。 Fluent NHibernate Release Notes 1.0 : http://wiki.fluentnhibernate.org/Release_notes_1.0
脑洞的蜂蜜
2018/02/02
6590
[原创]Fluent NHibernate之旅二--Entity Mapping
接着上一篇,今天我们说说ORM中的Mapping。如果你要体验NHibernate的强大,首先你就要学会配置,包括SessionFactory和Mapping的配置。今天跟上一篇一样,会使用传统方式和 NHibernate 进行讲解。如果你要亲手试验一下,可以先看一下“Fluent NHibernate之旅一”,进行一下数据库和SessionFactory的准备。 本节内容: 简单实体映射 使用自定义类型映射实体属性 NHibernate的实体映射(Entity Mapping)做的非常好,虽然不是完美
脑洞的蜂蜜
2018/02/02
1.1K0
[原创]Fluent NHibernate之旅二--Entity Mapping
[原创]Fluent NHibernate之旅(四)-- 关系(中)
接着上一篇,我们继续讲解ORM中的关系。在数据库设计中,我们最多打交道的,要算一对多关系了,延续我们的示例,我们来讲解一下一对多的关系。 Fluent NHibernate之旅系列导航: 一、开篇:ISessionFactory Configuration 二、实体映射:Entity Mapping 三、继承映射:Inheritence Mapping 四、一对一映射:One-to-One Mapping 场景和数据库设计 延续我们的演示范例,用户和订单是非常典型的一对多范例。 1、一个用户可以拥有多个订单
脑洞的蜂蜜
2018/02/02
7420
[原创]Fluent NHibernate之旅(四)-- 关系(中)
Fluent Nhibernate之旅(五)--利用AutoMapping进行简单开发
Fluent Nhibernate(以下简称FN)发展到如今,已经相当成熟了,在Nhibernate的书中也相应的推荐了使用FN来进行映射配置,之前写的FN之旅至今还有很多人会来私信我问题,说来惭愧,从FN之旅四至今已经4年多,至今还未更新过此系列,原因有很多,最大的就是懒惰,哈。 一、开篇:ISessionFactory Configuration 二、实体映射:Entity Mapping 三、继承映射:Inheritence Mapping 四、一对一映射:One-to-One Mapping 五、一
脑洞的蜂蜜
2018/02/02
9810
Fluent Nhibernate之旅(五)--利用AutoMapping进行简单开发
SQL级联删除_级联删除用例
删除A表内id为‘11’的数据,发现B表内userId 为“11”也被数据库自动删除了,这就是级联删除
全栈程序员站长
2022/11/10
1.4K0
如何使用Fluent Nhibernate中的Automapping进行OR Mapping映射
由于在项目中使用了NHibernate来作为ORMapping构建数据访问层,那么就必须要配置Object和DataTable的映射。最早的项目中,我们使用了最传统的XML配置文件的方式编写映射关系,但是这样太麻烦,每次修改class和表时都要去修改对应的XML文件,而且还容易出错,一定有疏忽遗漏的地方,还不容易找出错误,所以在第二个项目中,我们使用了Fluent NHibernate的Mapping方式代替XML配置。使用Fluent NHibernate的最大好处是降低了出错的机会,因为Fluent Nhibernate的配置是使用C#来编写,可以智能感知,而且还能编译,不像原始的XML配置,写错了都不知道。
深蓝studyzy
2022/06/16
1.1K0
StatefulSet级联和非级联删除(一)
StatefulSet是Kubernetes中的一种有状态应用管理机制,它允许用户在集群中运行有状态应用程序,并对其进行有效的管理。StatefulSet能够确保有状态应用程序具有唯一的网络标识符、稳定的持久化存储和有序的部署、更新和删除。在StatefulSet中,有两种删除方式:级联删除和非级联删除。
玖叁叁
2023/04/30
8090
StatefulSet级联和非级联删除(二)
非级联删除是指在删除StatefulSet时,Kubernetes只删除StatefulSet本身,而不删除相关的Pod和存储卷。这种删除方式适用于用户需要保留有状态应用程序的数据并在以后重新创建StatefulSet的情况。
玖叁叁
2023/04/30
6550
Oracle 级联删除外键
所谓的级联删除是指当主表中的一条记录被删除,那么子表中所关联的记录也相应的自动删除。本教程将教大家如何在Oracle中使用级联删除外键。
用户8965210
2021/09/02
1.2K0
连贯NHibernate 1.0正式发布
连贯NHibernate(Fluent NHibernate) 是通过编程方式而不是使用XML配置文件创建NHibernate映射的API。它的目标是在项目中运用NHibernate时减少所遇到的困难,提供更好的可读性、可测试性和编译时的安全性。连贯NHibernate降低了复杂性,并进一步加强了约定胜于配置的原则,即任何一个映射的最常用设置是默认的。 除了编译时的检查外连贯NHibernate还为你的映射的测试提供了一个健壮的API。 连贯NHibernate 1.0已经正式发布,可以从这里获取http:
张善友
2018/01/31
6520
C# 数据操作系列 - 12 NHibernate的增删改查
上一篇《C# 数据操作系列 - 11 NHibernate 配置和结构介绍》 介绍了Nhibernate里的配置内容。这一篇将带领大家了解一下如何使用NHIbernate。之前提到NHibernate继承了Hibernate的一些传统:使用XML文件进行配置,这一点也是备受争议。不过,有社区爱好者开发了一个名为《Fluent NHibernate》的项目,用来支持NHibernate的流式配置。当然,NHibernate本身也提供了NHibernate.Mapping.ByCode模式。不过这一篇暂且略过,留待下文。
程序员小高
2020/05/26
1.2K0
Nhibernate_nhibernate与ef区别
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说Nhibernate_nhibernate与ef区别,希望能够帮助大家进步!!!
Java架构师必看
2022/07/19
6070
NHibernate 缓存
一级缓存就是 ISession 缓存, 在 ISession 的生命周期内可用, 多个 ISession 之间不能共享缓存的对象, 通过 ISessionFactory 创建的 ISession 默认支持一级缓存, 不需要特殊的配置。 在 NHibernate 的参考文档中, 对 ISession 的描述如下:
beginor
2020/08/06
6130
近期开发中遇到的问题总结
最近准备把后台管理系统重新设计开发下,使用了bootstrap,在网上找了个漂亮的后台模板:sb2-admin,在使用中遇到了不少问题,总结下,以免以后忘记。 1、EF5利用NuGet升级到EF6后,一些Attribute冲突[未解决]:       我原先的数据驱动使用的是Fluent Nhibernate +Nhibernate+MSSQL2005,本来想玩玩EF的,而且现在新创建的MVC项目模板中,都会自带EF。因为EF5不支持项目模板生成Code First,所以升级到了EF
脑洞的蜂蜜
2018/02/01
8750
近期开发中遇到的问题总结
NHibernate分页
转载:http://www.cnblogs.com/tenghoo/archive/2011/02/14/1954393.html
跟着阿笨一起玩NET
2018/09/19
4730

相似问题

Fluent NHibernate级联删除问题

23

Fluent NHibernate级联删除错误

21

使用fluent nhibernate进行级联删除

13

fluent nhibernate图形级联

12

Fluent NHibernate -级联所有删除Orphan不做任何删除

28
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文