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

如何将NHibernate从表A映射到表A本身具有多对多?

要将NHibernate从表A映射到表A本身具有多对多关系,您需要遵循以下步骤:

  1. 创建一个中间表(例如:TableA_TableA),该表将包含两个外键,一个指向表A的第一个实例,另一个指向表A的第二个实例。
  2. 在NHibernate映射中,您需要创建两个多对多关系。第一个将表A映射到中间表,第二个将中间表映射回表A。
  3. 在表A的映射类中,添加一个集合属性,该属性将表示与该实例相关的所有表A实例。
  4. 在中间表的映射类中,添加两个属性,它们将分别表示与该实例相关的两个表A实例。

以下是一个示例:

代码语言:csharp
复制
public class TableAMapping : ClassMap<TableA>
{
    public TableAMapping()
    {
        Id(x => x.Id);
        Map(x => x.Name);
        HasManyToMany(x => x.RelatedTableAs)
            .Table("TableA_TableA")
            .ParentKeyColumn("TableAId")
            .ChildKeyColumn("RelatedTableAId")
            .Cascade.All();
    }
}

public class TableA_TableAMapping : ClassMap<TableA_TableA>
{
    public TableA_TableAMapping()
    {
        CompositeId()
            .KeyReference(x => x.TableA, "TableAId")
            .KeyReference(x => x.RelatedTableA, "RelatedTableAId");
    }
}

public class TableA
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual IList<TableA> RelatedTableAs { get; set; }
}

public class TableA_TableA
{
    public virtual TableA TableA { get; set; }
    public virtual TableA RelatedTableA { get; set; }
}

在这个示例中,我们首先创建了一个名为TableA_TableA的中间表,并在TableAMapping中定义了一个多对多关系,该关系将表A映射到中间表。然后,在TableA_TableAMapping中,我们定义了一个复合主键,该主键由TableAIdRelatedTableAId组成。最后,在TableA类中,我们添加了一个RelatedTableAs属性,该属性将表示与该实例相关的所有表A实例。

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

相关·内容

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

下面推荐10个主流比较流行的ORM框架,都是开源的项目: 一、SqlSugar(国内) 支持SqlServer、MySql、PgSql和Oracle插入blukcopy 分大数据自处理 支持租户、库事务...支持一的导航属性 支持MySql、SqlServer、Sqlite、Oracle、postgresql、QuestDb、ClickHouse、达梦、人大金仓、神通数据库、瀚高、MsAccess...经过数十个版本的更新迭代发布全新v2.0版本,支持动态列/、分库/分等。...EF有三种使用场景: 1、数据库生成Class。 2、由实体类生成数据库结构。 3、通过数据库可视化设计器设计数据库,同时生成实体类。...(V5) 用于记录异常、安装值转换器和将列映射到没有属性的属性的挂钩。

4.1K41
  • NHibernate教程

    对象/关系数据库映射(object/relational mapping (ORM))这个术语表示一种技术,用来把对象模型表示的对象映射到基于SQL的关系模型数据结构中去。...NHibernate除了能将一张映射为一个对象,还可以将间关系变为对象的属性。例如学生和课程间的多关系就可以转化为学生类中的一个课程集合的属性。...由此可见,NHibernate不仅仅管理.Net类到数据库的映射,还提供数据查询和获取数据的方法。因此采用NHibernate,可以大幅度减少开发时人工使用SQL处理数据的时间。...二、NHibernate使用步骤 1.为系统引入NHibernate的库,并且配置NHibernate; 2.新建一个将要持久化.Net对象的; 3.构建一个需要被持久化的.Net类; 4.构建一个可以让...创建.Net类和与其对应的XML文件 (1) 单的情况 单的情况就是指该没有和其他有关联的情况。这样情况下,可以用软件来辅助产生类和对应的XML文件。

    36510

    NHibernate学习笔记之一,Hello world!

    NHibernate是一个面向.NET环境的对象/关系数据库映射框架,主要应用在数据持久层,和其它的ORM框架一样用来把对象模型表示的对象映射到基于SQL的关系模型数据结构中去。...文件夹中的对应数据库配置文件,这里使用MSSQL,所以复制“MSSQL.cfg.xml”,并NHibernate的配置信息适当修改 。...3、编写实体类(POCO,Plain Old CLR Objects),映射文件包含POCO类映射到一个或者多个数据库的元数据信息。User.cs文件如下所示。...的工作单元,它是一个持久化管理器,我们通过ISession来数据库中存取数据。...总结:这个示例算是Nhibernate学习的一个“Hello world”,内容中有不少是参照前辈们的文章,我只是学习和分享学习。

    59620

    NHibernate实践与模式

    NHibernate实践与模式 NHibernate是一款非常优秀的O/R mapping的开源框架,再还没有.net的时候它已经存在于java环境中。...下面我们先看一下它的框架 工作原理 将数据库结构映射成实体类(xml-mapping文件,实体类 ,class文件),支持一一,的关系,默认生成对这些的CURD操作,包括多表脊联操作...CURD的操作语句可以源代码看,它是生成的是参数形势的sql脚本并且支持特别的参数,如,oracle的to_date,to_char等; 从上图可以看出实现了数据库的无关性,开发人员无须关心底层的数据库类型...然后再去创建数据库,和UI的部分; 我还是按在有数据的情况下如何用NHibernate作开发 1.用MyGeneration创建实体类和mapping文件选择NHibernate lujan99 1.06...总结 使用O/R mapping确实能够提高开发效率,减少了开发过程中产生的低级bug,新手很容易上手,整个项目的层次更加明显,耦合度降低。方便扩展,很好的隔离变化。

    81040

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

    ShardingCore - EF Core分分库读写分离的扩展。...Dapper Dapper是一个简单的.NET对象映射器,在速度方面具有"King of Micro ORM"的头衔,几乎与使用原始的ADO.NET数据读取器一样快。...主要特点: 支持 CodeFirst 模式,即便使用 Access 数据库也支持数据迁移; 支持 DbFirst 模式,支持数据库导入实体类,或使用实体类生成工具生成实体类; 支持 深入的类型映射,比如...PgSql 的数组类型等; 支持 丰富的表达式函数,以及灵活的自定义解析; 支持 导航属性一贪婪加载,以及延时加载; 支持 读写分离、分分库、过滤器、乐观锁、悲观锁; 支持 MySql/...NHibernate社区网站 - https://nhibernate.info GitHub地址:https://github.com/nhibernate/nhibernate-core SmartSql

    5.9K11

    NHibernate详解

    Nhibernate 来源于非常优秀的基于Java的Hibernate 关系型持久化工具。 NHibernate 数据库底层来持久化你的.Net 对象到关系型数据库。...NHibernate 为你处理这些,远胜于你不得不写SQL去数据库存取对象。你的代码仅仅和对象关联,NHibernat 自动产生SQL语句,并确保对象提交到正确的和字段中去。...第三步:写映射文件 现在我们有数据和需要去映射它的.Net类。我们需要一种方式去让NHibernate知道如何从一个映射到另一个。这个任务依赖于映射文件来完成。...在这个例子里我们装配件(最后编译的DLL文件名称)NHibernate.Examples 装载类NHibernate.Examples.QuickStart.User 。...你将有以下内容 User.cs —-你需要持久化的C#类 User.hbm.xml —-你的NHibernate映射文件(记得编译为嵌入的资源) App.config —ADO.NET

    67530

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

    (比如CostCenter中有public virtual long Id{get;set;},对应中的列COST_CENTER_ID) 对于一的关系,使用父方的类名作为属性名,中使用父的主键列名作为对应的外键列的列名...对于的关系,把两个类对应的名进行排序,将小的排前面,然后将两个名连接起来,中间使用“_”分割。...(比如Course和Student是多关系,那么产生的中间表表名为COURSE_STUDENT) 对于枚举,在数据库中使用tinyint也就是一个Byte来存储,枚举在Automapping中作为UserType...ISubclassInstance instance) { instance.DiscriminatorValue(instance.EntityType.Name); } } 对于5...,就需要实现IHasManyToManyConvention接口,在这个接口中两个名进行排序,然后进行连接表示中间

    1.1K10

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

    ShardingCore - EF Core分分库读写分离的扩展。...Dapper Dapper是一个简单的.NET对象映射器,在速度方面具有"King of Micro ORM"的头衔,几乎与使用原始的ADO.NET数据读取器一样快。...主要特点: 支持 CodeFirst 模式,即便使用 Access 数据库也支持数据迁移; 支持 DbFirst 模式,支持数据库导入实体类,或使用实体类生成工具生成实体类; 支持 深入的类型映射...,比如 PgSql 的数组类型等; 支持 丰富的表达式函数,以及灵活的自定义解析; 支持 导航属性一贪婪加载,以及延时加载; 支持 读写分离、分分库、过滤器、乐观锁、悲观锁...NHibernate社区网站 - https://nhibernate.info GitHub地址:https://github.com/nhibernate/nhibernate-core SmartSql

    3.8K20

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

    在数据库模型设计中,最基本的实体关系有三种:一一、一。关于一使用的情况较多,之前也有过一些讨论,现在来说明一下在数据库中一一的模型设计。...首先,关系数据库中使用外键来表示一,使用中间和两边的外键来表示,而一一的话有三种表示方式:一种是使用相同的主键值,第二种是使用单边的外键,第三种就是使用双边外键。...在主键关联的情况下,如果主表中移除的引用,这个时候保存主表,是不会删除的,也不会删除这个一一的关系的。...但是这显然是不对的,我们需要的是一一,不是一。如果查询Classroom A的Class属性,那么就会报错,因为根本不知道应该是X还是Y。...这其实又带来了另外一个问题,这可能是NHibernate没有考虑到的地方,那就是我们采用的是软删除,也就是说根本不会数据库删除数据,只是把IS_DELETED置为1。

    48020

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

    ISession - NHibernate.ISession: 一个单线程、短生命周期的对象,表示应用程序和数据持久化之间一个连接。...基于DbConnection和DbCommand实现,并非直接暴露给应用程序,但是可以由开发者其进行扩展或实现。...配置项介绍 在上一篇文章中,我们介绍了一下如何设置NHibernate的基本配置项,但是并未配置项进行深入。...dialect 数据库方言,表示NHibernate连接的数据库是什么,该用哪种格式解析关系映射到数据库SQL语句 default_schema 默认的schema,用来设置连接字符串连接的数据库默认的...其中create表示每次只创建新增的;create-drop表示每次ISessionFactory创建时创建 ,ISessionFactory关闭时,删除;其中update表示每次都会将DDL SQL

    1.2K20

    NHibernate中关于Inverse的理解和使用

    数据库模型来说,这个不合理啊! 所以一般建议在Mapping时设置Inverse为True。对应的,在Code中也需要设置OrderItemOrder的引用。...比如有员工E1和E2,奖品A1和A2,其是多关系,如果要设置E1员工获得A1和A2奖,那么需要设置各自的集合: 1: Emp e1=new Emp(){Name = "E1"}; 2...这个时候可以在Award端设置Inverse=True,Emp端设置Inverse=False,表示其多关系不在Award方维护,只在Emp端维护: public class AwardMapping...总结: Inverse用于设置双向关联时Nhibernate在设置外键时依赖的对象,默认Inverse=False,一多时表示依赖一端的集合,如果为True表示依赖段对象中一端对象的引用。...多时不能让两端的Inverse为False,这样会造成数据的重复插入;必须设置一端为False,一端为True。

    46230

    NHibernate 映射的数据更新

    NHibernate 映射的数据更新 最近在用 NHibernate更新时突然发现 NHibernate 更新的策略很差, 多关系的更新居然是先全部删除再插入全部数据, 感觉非常奇怪...生成的 SQL 语句如下(仅包含关系 User_Role 的操作): DELETE FROM [User_Role] WHERE [UserId] = @p0;@p0 = 1 [Type: Int32...Tip: Use set for many-to-many associations 发现了解决方案, 将的映射的 bag 改为用 set , 问题终于得到了解决, 改过后的映射如下: Set(...不只是, 如果你的集合需要更新, NHibernate 推荐的是: 19.5.2....sess.Flush(); 由此可见, bag 在映射更新时性能较差, 如果不需要更新,则可以放心使用, 在需要更新时则 set 是更好的选择。

    94610

    【论文解读】针对生成任务的模态图学习

    为了实现这一目标,论文提出了模态图学习(MMGL),这是一个通用而又系统的、系统的框架,用于多个具有关系结构的模态邻域中捕获信息。...(2)如何将模态邻域之间的图结构信息注入到LM中?(3)论文如何调整预先训练过的LM,以便以一种参数高效的方式邻域上下文中学习?...因此,它们不能直接应用于模态之间具有更一般的映射的模态数据集(例如,图1(b)中的模态维基百科网页)在这里,论文将模态学习的范围11映射扩展到模态图学习(MMGL)中,同时通过将它们集成到预先训练的...四、实验4.1 WikiWeb2M数据集WikiWeb2M数据集是为具有文本和图像关系的模态内容理解的一般研究而构建的。...计算出的位置编码首先通过1层MLP映射到LMs的文本空间,添加到输入标记/文本/图像嵌入中,并输入到LMs中。在3中,GNN嵌入显示的性能最好。

    30220

    数据仓库专题(7)-维度建模11大基本原则

    ,有时会多个流程事实合并成一个事实,而且合并事实单一流程事实的一 个很好的补充,并不能代替它们。...原则5、解决事实中的多关系   由于事实存储的 是业务流程事件的结果,因此在它们的外键之间存在(M:M)的关系,如多个仓库中的多个产品在多天销售,这些外键字段不能为空,有时一个维度可以为...原则6、解决维度一的关系   属性之间分层的、一(M:1)的关系通常未规范化,或者被收缩到扁平型维度中,如果你曾经有过为事务型系统设计实体关系模型的经历,那你一定要抵抗住旧有的思维模式,要将其规范化或将...在单个维度一(M:1)的关系非常常见,一一的关系,如一个产品描述对应一个产品代码,也可以在维度中处理,在事实中偶尔也有一关系,如详细当维度中有上百万条记录时,它推出的属性又经常发生变化...,即使你的商业用户没有初始化跟踪属性改变的设想值,使用代理也会使下游策略变化更宽松,代理也允许你使用多个业务键 射到一个普通的配置文件,有利于你缓冲意想不到的业务活动,如废弃产品编号的回收或收购另一家公司的编码方案

    1.8K30

    数据仓库专题(7)-维度建模10大基本原则

    ,有时会多个流程事实合并成一个事实,而且合并事实单一流程事实的一 个很好的补充,并不能代替它们。...原则5、解决事实中的多关系   由于事实存储的 是业务流程事件的结果,因此在它们的外键之间存在(M:M)的关系,如多个仓库中的多个产品在多天销售,这些外键字段不能为空,有时一个维度可以为...原则6、解决维度一的关系   属性之间分层的、一(M:1)的关系通常未规范化,或者被收缩到扁平型维度中,如果你曾经有过为事务型系统设计实体关系模型的经历,那你一定要抵抗住旧有的思维模式,要将其规范化或将...在单个维度一(M:1)的关系非常常见,一一的关系,如一个产品描述对应一个产品代码,也可以在维度中处理,在事实中偶尔也有一关系,如详细当维度中有上百万条记录时,它推出的属性又经常发生变化...,即使你的商业用户没有初始化跟踪属性改变的设想值,使用代理也会使下游策略变化更宽松,代理也允许你使用多个业务键 射到一个普通的配置文件,有利于你缓冲意想不到的业务活动,如废弃产品编号的回收或收购另一家公司的编码方案

    1.3K50

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

    在数据库设计时,主要就是实体和关系的设计,实体表现出来就是,关系表现出来就是外键。而对于一个,由两部分组成:主键和属性。主键的简单定义就是中为每一行数据的唯一标识。...数据库主键与业务主键 前面说到一个可能有很多个唯一标识的候选键,那么这么候选键中,哪个应该拿来做主键呢?...主要是出于以下考虑: 具有业务意义的字段很可能是用户系统录入的,不要信任用户的任何输入,只要是用户自己录入的,那么就很有可能录错了,如果发现录入错误,这个时候再主键进行修改,将会涉及到大量关联的外键的修改...联合主键主要使用在的关系时,中间就需要使用联合主键。在简单的多关系中,我们不需要为中间的关联建立实体,所以中间可能就只需要两列,分别是两个实体表的主键。...该值由NHibernate程序内部生成。 其他程序赋值,完全由程序根据自己的算法生成并赋值。

    1.1K30

    什么是JPA?Java Persistence API简介

    要修改数据库,首先需要创建一个SQL查询,该查询Java对象映射到关系数据库中的。然后,只要对象签名发生更改,就必须修改SQL。使用JDBC,维护SQL本身就成了一项任务。...CRUD操作 将类映射到数据库并建立其主键后,即可拥有在数据库中创建,检索,删除和更新该类所需的一切。...JPA还具有管理彼此相关实体的能力。在和对象中都有四种实体关系: 一到 许多到一 许多一 一比一 每种类型的关系描述了实体与其他实体的关系。...例如,Musician实体可以与由诸如List或Set的集合表示的实体具有的关系。...您可以使用注释来自定义提取策略,但JPA的默认配置通常可以直接使用,无需更改: 一:lazy 一:eager :lazy 一一:eager JPA安装和设置 最后,我们将简要介绍如何为Java

    10.2K30

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

    Fluent Nhibernate(以下简称FN)发展到如今,已经相当成熟了,在Nhibernate的书中也相应的推荐了使用FN来进行映射配置,之前写的FN之旅至今还有很多人会来私信我问题,说来惭愧,...Mapping 五、一映射:One-to-Many Mapping 六、Fluent NHibernate之旅(四)-- 关系(下) 安装 现在在项目中使用FN很方便,使用Nuget管理就可以了...刚我们的测试报错,是因为Employee中的Name是个UserName类,Nhibernate的Component,我在FN之旅四(上)中有介绍到,默认情况下映射根据字段映射到数据库的,所以上面的测试会报错...这里我只测试了Employee和Store两个实体,对于还未测试,时间有限,等有时间下篇继续下。...是有很多限制的,比如Id,比如Component等,当然我们可以通过重写DefaultAutomappingConfiguration的一些方法来进行合适的一些配置,如果您要对持久类有一些要求,不对一

    96360
    领券