首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

NHibernate多对多在插入之前删除所有关联

在 NHibernate 中,多对多关系是通过一个中间表来实现的。在插入之前删除所有关联,可以通过以下步骤实现:

  1. 获取多对多关系的集合

可以通过以下代码获取多对多关系的集合:

代码语言:csharp
复制
var collection = session.QueryOver<EntityA>()
    .Where(x => x.Id == id)
    .Fetch(x => x.EntityBs).Eager
    .SingleOrDefault();

其中,EntityAEntityB 分别表示多对多关系中的两个实体,EntityBsEntityA 中的集合属性。

  1. 删除多对多关系的集合

可以通过以下代码删除多对多关系的集合:

代码语言:csharp
复制
var collection = session.QueryOver<EntityA>()
    .Where(x => x.Id == id)
    .Fetch(x => x.EntityBs).Eager
    .SingleOrDefault();

collection.EntityBs.Clear();

session.SaveOrUpdate(collection);

其中,Clear() 方法用于清空集合,SaveOrUpdate() 方法用于保存或更新实体。

  1. 插入新的多对多关系

可以通过以下代码插入新的多对多关系:

代码语言:csharp
复制
var collection = session.QueryOver<EntityA>()
    .Where(x => x.Id == id)
    .Fetch(x => x.EntityBs).Eager
    .SingleOrDefault();

var newEntityB = new EntityB { ... };

collection.EntityBs.Add(newEntityB);

session.SaveOrUpdate(collection);

其中,newEntityB 是新的 EntityB 实例,Add() 方法用于将新的实例添加到集合中,SaveOrUpdate() 方法用于保存或更新实体。

需要注意的是,在插入新的多对多关系之前,应该先删除旧的多对多关系,以避免出现重复数据的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

NHibernate中关于Inverse的理解和使用

在使用NHibernate进行数据库操作的时候,比如数据插入的时候,经常用到级联功能,比如最常见的就是一个订单对应多个明细行,在保存订单时只需要Save订单对象即可,订单下的所有明细行会级联保存。...比如有员工E1和E2,奖品A1和A2,其是多关系,如果要设置E1员工获得A1和A2奖,那么需要设置各自的集合: 1: Emp e1=new Emp(){Name = "E1"}; 2...但是如果删除第5行,保留6-7行则不行。...总结: Inverse用于设置双向关联Nhibernate在设置外键时依赖的对象,默认Inverse=False,一多时表示依赖一端的集合,如果为True表示依赖段对象中一端对象的引用。...多时不能让两端的Inverse为False,这样会造成数据的重复插入;必须设置一端为False,一端为True。

46530

Fluent NHibernate之旅(四)-- 关系(上)

数据库关系 数据库关系一般有: 1、一一 2、一 3、 开始 结合我们前三个系列的示例,我们这一次加一个用户表[User],目的就是存储用户信息所用,再加一个UserDetail,作为用户的详细信息...很多关联方法都是与NHibernate很类似的,比如Cascade,Cascade.All代表的是cascade="all",代表的是无论什么操作,都会同时操作关联对象。...不支持one-to-one的Lazy的特性,也就是说NHibernate不支持一一的延迟加载。...NHibernate是不支持one-to-one的延迟加载的,我也不知道为什么,但我们可以婉转的进行延迟加载,老赵已经在他的文章“NHibernate中一关联的延迟加载”中提出了解决方案,大家可以看一下...今天说了关联中比较简单的一一关系,其实一一关系并不简单,第一次接触的时候,难免会遇到各种问题,很欢迎大家能留言,大家一起讨论问题。

1.2K60
  • NHibernate 映射的数据更新

    NHibernate 映射的数据更新 最近在用 NHibernate更新时突然发现 NHibernate 更新的策略很差, 多关系的更新居然是先全部删除插入全部数据, 感觉非常奇怪...Tip: Use set for many-to-many associations 发现了解决方案, 将的映射的 bag 改为用 set , 问题终于得到了解决, 改过后的映射如下: Set(...typeof(Role)); map.Column("[RoleId]"); }); } ); 将 UserMapping 和 RoleMapping 中映射全部改为...不只是, 如果你的集合需要更新, NHibernate 推荐的是: 19.5.2....sess.Flush(); 由此可见, bag 在映射更新时性能较差, 如果不需要更新,则可以放心使用, 在需要更新时则 set 是更好的选择。

    94910

    NHibernate教程

    NHibernate除了能将一张表映射为一个对象,还可以将表间关系变为对象的属性。例如学生和课程间的多关系就可以转化为学生类中的一个课程集合的属性。...创建.Net类和与其对应的XML文件 (1) 单表的情况 单表的情况就是指该表没有和其他表有关联的情况。这样情况下,可以用软件来辅助产生类和对应的XML文件。...使用NHibernate的API进行编程 数据库编程不外乎“添加”、“删除”、“更新”,看看NHibernate是如何实现这三种操作吧。...SessionFactory.OpenSession(); Student obj=(Student) vSession.Load(typeof(Student),studentID); vSession.Close(); (5) 插入...; } catch(Exception) { vTransaction.Rollback(); } finally { vSession.Close(); } (7) 删除

    36910

    One to One 的数据库模型设计与NHibernate配置

    在数据库模型设计中,最基本的实体关系有三种:一一、一。关于一使用的情况较多,之前也有过一些讨论,现在来说明一下在数据库中一一的模型设计。...首先,关系数据库中使用外键来表示一,使用中间表和两边的外键来表示,而一一的话有三种表示方式:一种是使用相同的主键值,第二种是使用单边的外键,第三种就是使用双边外键。...在主键关联的情况下,如果从主表中移除从表的引用,这个时候保存主表,是不会删除从表的,也不会删除这个一一的关系的。...这其实又带来了另外一个问题,这可能是NHibernate没有考虑到的地方,那就是我们采用的是软删除,也就是说根本不会从数据库删除数据,只是把IS_DELETED置为1。...那么,我们如果先保存了A和X的关系,接下来由于X被取消,所以我删除了X,接下来添加Y与A关联就会失败。

    48620

    盘点 .NET 比较流行的开源的ORM框架

    下面推荐10个主流比较流行的ORM框架,都是开源的项目: 一、SqlSugar(国内) 支持SqlServer、MySql、PgSql和Oracle插入blukcopy 分表大数据自处理 支持租户、库事务...支持一的导航属性 支持MySql、SqlServer、Sqlite、Oracle、postgresql、QuestDb、ClickHouse、达梦、人大金仓、神通数据库、瀚高、MsAccess...您可以使用 Chloe.ORM 通过 lambda 查询 LINQ 之类的数据并执行任何操作(查询 | 组查询 | 聚合查询 | 插入 | 批量更新 | 批量删除)。...开源地址:https://github.com/dotnet/ef6 六、NHibernate(国外) NHibernate 是一个成熟的开源对象关系映射器,适用于 .NET 框架。...插入/删除/更新/保存和 IsNew 的辅助方法 分页请求会自动计算出总记录数并获取特定页面。 简单的交易支持。 更好的参数替换支持,包括从对象属性中获取命名参数。

    4.1K42

    NHibernate联合主键详细示例

    使用NHibernate实现一一的关联很是简单,可如果要用复合主键实现确实让人有些淡淡的疼。虽然很淡疼但还是要去抹平这个坑,在下不才,愿意尝试。...实现一一的映射 这步没有多大难度,主要处理好注解的顺序即可,以及OneToMany时联合主键如何设置的问题.示例代码如下: [Bag(0, Name = "Childs", Cascade...int GetHashCode() { return (this.Id + "|" + this.GroupNumber).GetHashCode(); //判断缓存是否存在,已此作为Key } 插入数据时报错...,提示SqlParameterCollection的索引无效[索引溢出错误] 原因,最初在设计Parent的时候,与联合主键共用了一个字段GroupNumber,导致在NHibernate做映射转换的时候会计算出一个需要填充的值

    1.5K80

    数据库模型设计——主键的设计

    GUID类型:这个类型并不是所有数据库都有对应的数据类型,SQL Server有uniqueidentifier,MySQL没有。...在插入新数据时,GUID一般都是使用NewId()这样的生成随机GUID的方式生成的,所以也不是顺序增长的,在插入速度上不会很快。...主要是出于以下考虑: 具有业务意义的字段很可能是用户从系统录入的,不要信任用户的任何输入,只要是用户自己录入的,那么就很有可能录错了,如果发现录入错误,这个时候再主键进行修改,将会涉及到大量关联的外键表的修改...联合主键主要使用在的关系时,中间表就需要使用联合主键。在简单的多关系中,我们不需要为中间的关联建立实体,所以中间表可能就只需要两列,分别是两个实体表的主键。...该值由NHibernate程序内部生成。 其他程序赋值,完全由程序根据自己的算法生成并赋值。

    1.1K30

    2022年了有哪些值得推荐的.NET ORM框架?

    、更新、删除)来补充Dapper。...DbFirst 模式,支持从数据库导入实体类,或使用实体类生成工具生成实体类; 支持 深入的类型映射,比如 PgSql 的数组类型等; 支持 丰富的表达式函数,以及灵活的自定义解析; 支持 导航属性一...、贪婪加载,以及延时加载; 支持 读写分离、分表分库、过滤器、乐观锁、悲观锁; 支持 MySql/SqlServer/PostgreSQL/Oracle/Sqlite/Firebird/达梦/人大金仓...您可以使用 Chloe.ORM 通过 lambda 查询 LINQ 之类的数据并执行任何操作(加入查询 | 组查询 | 聚合查询 | 插入 | 批量更新 | 批量删除)。...主要特点: 非常容易与现有项目集成并在所有 .NET 平台上运行。 SQLite 上的瘦包装器,快速高效。(这个库不应该是您查询的性能瓶颈。)

    5.9K11

    Fluent NHibernate之旅二--Entity Mapping

    如果你要体验NHibernate的强大,首先你就要学会配置,包括SessionFactory和Mapping的配置。今天跟上一篇一样,会使用传统方式和 NHibernate 进行讲解。...今天的内容不涉及关联关系,所以我们今天暂且不说Order。 好了,接下来开始我们的代码演示阶段。...当然还有很多,因为有了智能感知,我们只要.一下就能看到很多方法,但有一点你要注意,.ColumnName()后就不能再进行配置了,所以其他一些配置,你要放在ColumName之前。...Product我们映射好了,我们试着测试一下吧,这一次,我们用传统方式插入数据,用Fluent方式获取数据,测试代码如下: [TestMethod] public void NHibernateFactory...NHibernate是个强大的ORM框架,他的了解我还太浅,还需要一定的时间去掌握。

    1K90

    2022年了有哪些值得推荐的.NET ORM框架?

    、更新、删除)来补充Dapper。...模式,支持从数据库导入实体类,或使用实体类生成工具生成实体类; 支持 深入的类型映射,比如 PgSql 的数组类型等; 支持 丰富的表达式函数,以及灵活的自定义解析; 支持 导航属性一...、贪婪加载,以及延时加载; 支持 读写分离、分表分库、过滤器、乐观锁、悲观锁; 支持 MySql/SqlServer/PostgreSQL/Oracle/Sqlite/Firebird...您可以使用 Chloe.ORM 通过 lambda 查询 LINQ 之类的数据并执行任何操作(加入查询 | 组查询 | 聚合查询 | 插入 | 批量更新 | 批量删除)。...NHibernate社区网站 - https://nhibernate.info GitHub地址:https://github.com/nhibernate/nhibernate-core SmartSql

    3.8K20

    理解elasticsearch的parent-child关系

    Parent-Child与Nested非常类似,都可以用来处理一的关系,如果的关系,那就拆分成一多在处理。...注意插入公司数据的type是branch,数据的id用的是city字段, 添加员工数据的时候,要指定的父文档是属于哪个,这样才能把父子数据给关联到同一台机器上。 ?...注意:如果parent的值改变了,必须删除这个parent下面的所有子文档然后删除本身,最后添加新的父文档,再添加新的子文档,否则parent值改变后,父文档的parent改变了,子的没改变会出现父子不在同一个...上面聚合的意思是: 按国家分组,然后算组内的员工再根据其爱好进行分组 最后,parent-child模式,支持多层的关系 一个,目前官网上给出了3层关系的例子,从社区上来看说是支持无限层级的关系映射...第三层的插入数据用了parent字段来确保和父文档的关联,又用了routding字段来确保和父文档,祖父文档位于同一个shard里面。

    2.8K60

    C# 数据操作系列 - 11 NHibernate 配置和结构介绍

    前言 今天是NHibernate的第二篇内容,通过上一篇的内容,我们初步了解了NHibernate的创建和使用。这一篇,我继续探索NHibernate背后的秘密。嗯,就是这样。 1....它们可能只是一些普通的POCO,仅仅是与ISession中关联起来了。只要ISession关闭了,这些对象就可以被分离出来然后可以在应用层的任意地方使用。...基于DbConnection和DbCommand实现,并非直接暴露给应用程序,但是可以由开发者其进行扩展或实现。...配置项介绍 在上一篇文章中,我们介绍了一下如何设置NHibernate的基本配置项,但是并未配置项进行深入。...其中create表示每次只创建新增的;create-drop表示每次ISessionFactory创建时创建表 ,ISessionFactory关闭时,删除表;其中update表示每次都会将DDL SQL

    1.2K20

    使用VS2015和Nhibernate实现与MySql数据库连接,实现增删改查操作

    ,MySQL-FRONT ,Connector/Net(选择.Net&Mono) Nhibernate包可以在VS2015中下载 ,MySql操作,我用的是MySQL-FRONT,注意要想实现和数据库的链接...先写一个简单的给你定义的数据库中添加一条元素的代码:(不使用Nhibernate的) 前提:先把该用的dll文件,添加到引用里面去不然,会连接不成功,之前下载的Connector/Net(选择.Net&...if (mycmd.ExecuteNonQuery() > 0) { Console.WriteLine("数据插入成功...包来实现一个很简单的对数据增删改查的操作,这一次需要用到我们之前下载的Nhibernate包里面的文件,全部dll文件引入之后,“引用”下面应该是这样的: ?...session来进行操作数据库 } } } 4.在Manger文件里新建一个名为APengChaoManger的类,用来进行增删改查操作,代码如下: 实现查询表中所有姓名的操作

    1.4K30

    NHibernate总结

    现在的项目中数据访问使用的是NHibernate的一个ORM框架,小弟也是在后期加入项目组,之前NHibernate就一直没有接触过,所以一直在学习NHibernate,都是一些很基础的一些东西,写出来总结一下...如果你下个系统的学习NHibernate,给大家推荐一个博客,详细的介绍了NHibernate,我也是根据这篇博客学习的。...ISession通过ISessionFactory打开,在所有的工作完成后,需要关闭。 ISessionFactory通常是个线程安全的全局对象,只需要被实例化一次。...我们可以在People.hbm.xml点击右键选择属性修改该文件的生成操作 (5)     NHData.cs库表People进行增删改查 现在完事具备只欠东风了,开始我们的数据库CRUD操作,在看该文件的代码时...lst.ForEach(c => crit.Add(c)); return crit.List()[0]; } //删除

    92540

    如何使用Fluent Nhibernate中的Automapping进行OR Mapping映射

    (比如CostCenter中有public virtual long Id{get;set;},对应表中的列COST_CENTER_ID) 对于一的关系,使用父方的类名作为属性名,表中使用父表的主键列名作为对应的外键列的列名...对于的关系,把两个类对应的表名进行排序,将小的排前面,然后将两个表名连接起来,中间使用“_”分割。...(比如Course和Student是多关系,那么产生的中间表表名为COURSE_STUDENT) 对于枚举,在数据库中使用tinyint也就是一个Byte来存储,枚举在Automapping中作为UserType...instance.EntityType; var childType = instance.ChildType; if (entityType == childType)//这里是专门对自身关联的情况进行特殊处理...ISubclassInstance instance) { instance.DiscriminatorValue(instance.EntityType.Name); } } 对于5

    1.1K10

    Fluent Nhibernate之旅(五)--利用AutoMapping进行简单开发

    Fluent Nhibernate(以下简称FN)发展到如今,已经相当成熟了,在Nhibernate的书中也相应的推荐了使用FN来进行映射配置,之前写的FN之旅至今还有很多人会来私信我问题,说来惭愧,从...Mapping 五、一映射:One-to-Many Mapping 六、Fluent NHibernate之旅(四)-- 关系(下) 安装 现在在项目中使用FN很方便,使用Nuget管理就可以了...配置 准备工作完成,今天我们要说下FN的AutoMapping,之前呢我们都是用了FluentMapping进行手动的Map映射,如果可以的话,请大家还是使用之前的映射方式,因为AutoMapping有很多契约...这里我只测试了Employee和Store两个实体,对于还未测试,时间有限,等有时间下篇继续下。...是有很多限制的,比如Id,比如Component等,当然我们可以通过重写DefaultAutomappingConfiguration的一些方法来进行合适的一些配置,如果您要对持久类有一些要求,不对一

    97060
    领券