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

Fluent nHibernate -将多态属性映射到表中的单个列

Fluent NHibernate 是一个用于在 .NET 平台上实现面向对象关系映射(ORM)的开源工具。它提供了一种优雅的方式来定义对象和关系数据库之间的映射关系,其中包括多态属性映射到表中的单个列。

多态属性是指在面向对象编程中,一个对象可以具有多个不同类型的属性。在关系数据库中,通常会将多态属性拆分成多个列来存储。但是,通过使用 Fluent NHibernate,可以将这些多态属性映射到表中的单个列,提供更简洁和高效的数据存储。

Fluent NHibernate 提供了一个名为"Discriminator"的映射选项,用于标识多态属性的类型。它可以通过在映射文件中使用一些特定的配置来实现。以下是一个示例,展示了如何使用 Fluent NHibernate 将多态属性映射到表中的单个列:

代码语言:txt
复制
public class VehicleMap : ClassMap<Vehicle>
{
    public VehicleMap()
    {
        DiscriminateSubClassesOnColumn("VehicleType")
            .AlwaysSelectWithValue()
            .Not.Nullable()
            .CustomType(typeof(string))
            .Length(50);
    }
}

public class CarMap : SubclassMap<Car>
{
    public CarMap()
    {
        DiscriminatorValue("Car");
        Map(x => x.Make);
        Map(x => x.Model);
    }
}

public class BikeMap : SubclassMap<Bike>
{
    public BikeMap()
    {
        DiscriminatorValue("Bike");
        Map(x => x.Brand);
        Map(x => x.WheelSize);
    }
}

在上述示例中,Vehicle 是一个基类,CarBike 是两个派生类。VehicleMap 类定义了基类的映射配置,其中 DiscriminateSubClassesOnColumn 方法用于指定多态属性映射的列名为 "VehicleType"。CarMapBikeMap 类分别定义了派生类的映射配置,并使用 DiscriminatorValue 方法来指定每个派生类的具体类型。

这种多态属性映射的优势在于可以将不同类型的对象存储在同一个表中,减少了表的数量和复杂性。同时,它还简化了查询和维护操作,提高了系统的灵活性和性能。

对于 Fluent NHibernate,腾讯云没有提供直接相关的产品和产品介绍链接地址。但是,腾讯云提供了适用于 .NET 开发的云计算服务,如云服务器(CVM)、云数据库 SQL Server(CDB)、云存储(COS)等,可以作为支持 Fluent NHibernate 开发和部署的基础设施。你可以访问腾讯云官方网站获取更多详细信息和文档。

相关搜索:如何使用NHibernate / Fluent NHibernate将2个数据库表中的记录包含到单个视图中?将表中的列合并到单个表中将多个列映射到Spark数据帧中的单个键将Fluent-NHibernate与不同数据库模式中的表一起使用将单个表中的两列合并为一列将连接表中的所有行和列合并到单个列中将多个表映射到单个DTO框架核心-某些属性不会在in.Entity输出中呈现查询将分组行中的某些列映射到同一行中的多个列的表在mvc剃刀中,将单个表的不同列中的数据检索到单个视图页面中实体框架6将ReferentialConstraint中的dependent属性映射到存储生成的列。错误将多对多关系中的相关属性映射到它们自己的“虚拟”列将一个表中的多个列连接到另一个表中的单个列如何将数据表中的列属性与带R的查找表中的列值进行匹配在Python中,如何将表1中的列值映射到另一个表2并追加回表1?VB.NET + LINQ:将从不同表中查询两列的结果保存在单个类属性中Ant设计中的表:将字符串传递给列属性中的呈现方法将一个表中的两个列映射到另一个表中的同一列时出现奇怪的异常如何将单个文件中的多个excel工作表连接到一个具有包含原始工作表名称的额外列的单个文件?将新属性插入到根据Oracle中两列之间的分钟差计算得出的表的列中Apache Hive -将一个表中的单个列以新名称合并到另一个表中
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

NHibernate 代码映射实体类

NHibernate 代码映射实体类 关于代码映射 NHibernate 3.2 自带了代码映射机制, 作为 xml 映射之外的一种映射方式, 由于推出的时间比较晚, 所以资料相对比较少, 而且与社区版的...Fluent Mapping 和 Attribute Mapping 不同, 有其独特的设计风格。...public ProductMapping() { // 此处添加映射代码 } } 映射到数据表 使用 Table 函数将类映射到制定的数据表: Table("product")...使用 Property 函数映射属性, NHibernate 提供了内置的工具类来简化代码: Property( m => m.Name, map => { map.Column...Attribute Mapping 相比, 对原来的 POCO 实体类没有污染 (Attribute) ; NHibernate 自带, 可以说是一等公民, 而 Fluent Mapping 是第三方维护的

91110

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

,我们使用了Fluent NHibernate的Mapping方式代替XML配置。...使用Fluent NHibernate的最大好处是降低了出错的机会,因为Fluent Nhibernate的配置是使用C#来编写,可以智能感知,而且还能编译,不像原始的XML配置,写错了都不知道。...更多的修改意味着更多的风险,为了减少这方面的风险,同时为了减少配置的工作量,所以在最新的项目中采用了Fluent NHibernate中的Automapping。...(比如CostCenter中有public virtual long Id{get;set;},对应表中的列COST_CENTER_ID) 对于一对多的关系,使用父方的类名作为属性名,表中使用父表的主键列名作为对应的外键列的列名...对于多对多的关系,把两个类对应的表名进行排序,将小的排前面,然后将两个表名连接起来,中间使用“_”分割。

1.1K10
  • Fluent NHibernate之旅二--Entity Mapping

    回答是当然需要,因为我们这里的属性名与表中的主键名是相同的,所以没有进行设置,如果你数据库的主键名是ID,这里我们只需要Id(m => m.ProductID).ColumnName(“ID”),你可以看到上述映射中的...映射做好了,接下来我们在NHibernate中把映射加到配置中。...二、使用自定义类型映射实体属性 NHibernate支持我们用自定义的类型来映射属性,但因为我是初学,我真的不会,当然我在网上找到了相关的资料,在此也不多说,就说说Fluent的方式吧,在我映射自定义属性的时候...为了接下来的方便,我把Fluent的Mapping都生成到我传统方式的Mapping目录中,加入到项目,设置成嵌入的资源,一切都为了以后的教程,换句话说以后的教程中,我一般都会使用Fluent来进行映射...前几天的开篇“Fluent NHibernate之旅一”,反响不是很好,或许大家用NHibernate的真的很少,或许我写的不够好,或许。。。。

    1K90

    Fluent NHibernate之旅(三)-- 继承

    经过了“开篇”和“简单映射”两篇文章,相信大家对Fluent NHibernate 有了一定的了解了,FluentNHibernate实际就是对 NHibernate 映射的一定扩展,我们能完全利用强类型...从这一篇开始,我们将使用Fluent NHibernate RC 1.0 版来进行演示,先前的代码,我会另外进行说明 继承 在OOP中,继承作为OO中重要的特性,如果NHibernate没有对它的支持,...中,一定看到过了,其实就是把父类、子类的所有属性放到一个表中,这样做的好处就是我们不需要建立其他表,一张表格全搞定,但缺点也显而易见,在属性少的情况下或许没有什么,但是多了以后,我们的维护、扩展就变得相对麻烦...在子类中,我们必须制定对应的标识符值,这里又出现败笔了,只能设定string类型,My God,变相的SetAttribute,我觉得这个已经脱离了Fluent的称号了(在RC升级介绍中已经说明)。...Table per subclass 在这种方式中,一个父类表包括了一些共同的属性,子类表除了主键外,就只有属于自己的属性。

    70080

    NHibernate学习笔记之一,Hello world!

    NHibernate是一个面向.NET环境的对象/关系数据库映射框架,主要应用在数据持久层,和其它的ORM框架一样用来把对象模型表示的对象映射到基于SQL的关系模型数据结构中去。...2、新建项目并添加引用,将NHibernate-3.3.0.GA-bin中的“Iesi.Collections.dll”与“NHibernate”引用到项目中,如图2所示复制Configuration_Templates...3、编写实体类(POCO,Plain Old CLR Objects),映射文件包含POCO类映射到一个或者多个数据库表的元数据信息。User.cs文件如下所示。...该文件将POPO类型与数据表进行映射。User.hbm.xml内容如下所示。 中,否则会报错“xxx is not mapped”,如图3所示具体方法是:选择User.hbm.xml文件->属性->生成操作,设置这个属性的值为“嵌入的资源” 图3 5

    60820

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

    经过了前面三篇的介绍,相信大家对Fluent NHibernate已经有一定的了解了,在我们学习中,Fluent 也已经进入了RTM版本。...这次的版本发布离RC版只有半个月不到,修正了很多bug,同时补充了大量的功能,在每天更新中,也看到了大量的单元测试,我们相信Fluent NHibernate 已经相对稳定成熟了。...Mapping 今天我们将说一下ORM中的R映射,我们现在的数据库大多都是关系型数据库了,所以可以说关系在我们数据库设计中也是非常重要的部分,NHibernate也非常重视这一块,但在传统方式中,配置就比较麻烦...,不是说我们Fluent能简单,只是传统方式的xml看上去不太美观,而Fluent这种代码式方式,更能符合我们Developer的习惯。...数据库关系 数据库关系一般有: 1、一对一 2、一对多 3、多对多 开始 结合我们前三个系列的示例,我们这一次加一个用户表[User],目的就是存储用户信息所用,再加一个UserDetail,作为用户的详细信息

    1.2K60

    Nhibernate入门与demo

    先看一张经典的图:      ORM:对象关系映射(O/R Mapping,Object Relational Mapping)表示一种技术,用来把对象模型表示的对象映射到基于SQL 的关系模型数据结构中去...通俗讲,就是我们操作实体类,然后让ORM框架自动映射到数据库中。      而Nhibernate就是:.Net环境下实现ORM的技术的一个框架!     ...先看项目整体图,作为初学的demo 没有层次,没有优化,只是作为入门的一个简单介绍!      第一步:设计数据库中的表。建立一个User表。...Email对应数据库的列SEmail 类型是String,长度50个字符。     ...然后对应数据库的表名。设置延迟加载为false。具体可以参考Nhibernate官方文档。 3、一定要将这个文件的属性:生成操作设置为嵌入资源!

    37230

    EntityFramework Core 学习扫盲

    包含和排除实体类型 将实体在Context中映射到数据库有多种方式: 使用DbSet定义属性。 在OnModelCreating方法中使用Fluent Api配置。...主键 默认情况下,EF CORE会将实体中命名为Id或者[TypeName]Id的属性映射为数据库表中的主键。当然有些开发者不喜欢将主键命名为Id,EF CORE也提供了两种方式进行主键的相关设置。...Fluent API [HasKey] Fluent Api方式中的HasKey方法可以将属性映射为主键,对于复合主键(多个属性组合而成的主键标识)也可以很容易地进行表示。...在Fluent Api中,有两种方法可以指定备用键,一种是当开发者将实体中的属性作为另一个实体的外键目标,另一种是手动指定。EF CORE的默认约束是前者。...顾名思义,一种继承结构全部映射到一张表中,比如Person父类,Student子类和Teacher子类,由EF CORE映射到数据库中时,将会只存在Person类,而Student和Teacher将以列标识的形式出现

    9.6K90

    Entity Framework Fluent API

    实际数据类型将因使用的数据库提供程序而异。将属性设置为行版本会自动将属性配置为开放式并发标记。...所以以下API的映射推荐使用FluentAPI的方式来设置映射 6.ToTable - TableAttribute:配置此实体类型映射到的表名 modelBuilder.Entity()....ToTable("Order", "Order");//指定“Order”对应表名及架构 7.HasColumnName - ColumnAttribute:配置用于存储属性的数据库列的名称 modelBuilder.Entity...除非指定此关系,否则实体类型的实例将无法保存到数据库。数据库中的外键不可为null。...可通过指定配置操作来自定义列和表。如果指定了空的配置操作,则约定将生成列名。如果在对象模型中公开了外键属性,则使用 HasForeignKey 方法。并非所有关系都支持在对象模型中公开外键属性。

    86210

    Nhibernate_nhibernate与ef区别

    这里是我们要做的: 1. 在数据库中创建把.Net类持久化的对应表. 2. 创建需要被持久化的.Net类. 3....步骤1:创建数据库表 我们正在做的是一个非常简单的NH示例.在这个例子里面,我们实现一个基本的用户管理子系统.我们将会使用一个user表(sql server 2000): use NHibernate...:第一个tag是class,这里我们把类型名(类名和Assembly名)映射到数据库中的user表(这里和hibernate有些不同,我们必须告诉NH这个类从哪儿来的.这个差异是由.Net和Java Reflect...name"属性值就是我们写的.Net类中的属性,column属性值就是在数据库中与'Net类属性对应的字段名.type属性是可选的(如果你没有标明,NH会给出一个最适合的),但是推荐的做法是带上这个属性...让我们返回到"id" tag,你可能会猜想这个tag和映射到表的Primary Key有关.正确.ID tag的格式和Property tag的相似.我们从Property(name)映射到目标数据库的字段

    60230

    Entity Framework 约定

    ,这时我们可以通过Fluent API 来忽略指定的模型映射到数据库中,代码写在EF上下文中: protected override void OnModelCreating(DbModelBuilder...id属性,会查找定义成***类名称+id***的属性,将这个属性作为主键)。...例如我们上一小节中定义的类 Department,类中没有名称为id的属性,但是存在名称为类名称+id的属性***DepartmentId***,因此DepartmentId属性,将会被映射为自增长的主键...二、关系约定 在数据库中,我们可以通过多张表的关联查询出数据,这多张表之间的关联,就是他们的关系。同样,也可以在模型中定义这样的关系。...简单的说就是:一个复杂类型作为已存在对象的属性,EF会将复杂类型的类映射到已存在的表中,已存在的表包将包含这些列,而不是将复杂类型映射成另外单独的一张表。

    1.3K10

    NHibernate总结

    NHibernate不仅仅管理.NET 类到数据库表的映射(包括.NET 数据类型到SQL 数据类型的映射),还提供数据查询和获取数据的方法,大幅度减少我们开发时人工使用SQL和ADO.NET处理数据的时间...封装Nhibernate底层操作,People.cs为实体类,People.hbm.xml为映射文件(把数据库表People映射到实体类People)。...,其中People实体类中的字段要设置为virtual。每个文件的详细代码在下面介绍 (2)     在NH.Data层引用Nhibernate相关的DLL ?...这正是NHibernate映射文件发挥作用的地方。映射文件包含了对象/关系映射所需的元数据。元数据包含持久化类的声明和属性到数据库的映射。...我们可以在People.hbm.xml点击右键选择属性修改该文件的生成操作 (5)     NHData.cs对库表People进行增删改查 现在完事具备只欠东风了,开始我们的数据库CRUD操作,在看该文件的代码时

    94040

    SqlAlchemy 2.0 中文文档(九)

    即使子类共享所有属性的基表,在使用声明性时,仍然可以在子类上指定mapped_column对象,指示该列仅映射到该子类;mapped_column将应用于相同的基本Table对象: class Employee...## 具体表继承 具体继承将每个子类映射到其自己的独立表,每个表包含产生该类实例所需的所有列。具体继承配置默认以非多态方式查询;对于特定类的查询将仅查询该类的表,并且仅返回该类的实例。...要修改我们的具体继承示例,以说明一个能够进行多态加载的“抽象”基类,我们将只有一个engineer和一个manager表,没有employee表,但是Employee映射器将直接映射到“多态联合”,而不是在...加载连接继承映射 请参阅编写用于继承映射的 SELECT 语句部分,了解继承加载技术的背景,包括在映射器配置时间和查询时间配置要查询的表。 单表继承 单表继承将所有子类的所有属性表示为单个表中的内容。...要修改我们的具体继承示例以说明一个能够进行多态加载的“抽象”基类,我们将只有一个 engineer 和一个 manager 表,没有 employee 表,但是 Employee 映射器将直接映射到“多态联合

    26710

    Nhibernate_juan benet

    在数据库中创建把.Net类持久化的对应表. 2. 创建需要被持久化的.Net类. 3. 创建映射文件,以告诉NH怎样持久化这些类的属性. 4....步骤1:创建数据库表 我们正在做的是一个非常简单的NH示例.在这个例子里面,我们实现一个基本的用户管理子系统.我们将会使用一个user表(sql server 2000): use NHibernate...:第一个tag是class,这里我们把类型名(类名和Assembly名)映射到数据库中的user表(这里和hibernate有些不同,我们必须告诉NH这个类从哪儿来的.这个差异是由.Net和Java Reflect...让我们暂时跳过”id” tag,先说property节点.”name”属性值就是我们写的.Net类中的属性,column属性值就是在数据库中与’Net类属性对应的字段名.type属性是可选的(如果你没有标明...让我们返回到”id” tag,你可能会猜想这个tag和映射到表的Primary Key有关.正确.ID tag的格式和Property tag的相似.我们从Property(name)映射到目标数据库的字段

    38350

    NHibernate详解

    第三步:写映射文件 现在我们有数据表和需要去映射它的.Net类。我们需要一种方式去让NHibernate知道如何从一个映射到另一个。这个任务依赖于映射文件来完成。...第一个有趣的标签是class。这里我们将映射类型名称(类名,装配件)到我们数据库中的User表,这里和Hibernate有一点点的不同。你将不得不告诉NHibernate从何处提取对象。...简要看一下,你将发现NHibernate所要做的工作。name属性的值正是我们.Net 类的属性,column属性值将是我们数据库里的字段。...type属性是可选的(如果你不标明,NHibernate将利用反射进行最佳的推测)。...你的数据库里有一张User表。 现在可以在你的代码中恰当简洁的使用NHibernate。简化的版本如下 1. 创建一个Configuration对象 2.

    70930

    01-EF Core笔记之创建模型

    默认情况下,如果你的类型中包含一个字段,那么EF Core都会将它映射到数据库中,导航属性亦是如此。...Fluent API进行配置: //包含类型 modelBuilder.Entity(); //包含属性,又叫做阴影属性,它会被映射到数据库中 modelBuilder.Entity...EF是实体框架,它的实体会映射到关系型数据库中。所以通过关系型数据库的表之间的关系更容易理解实体的关系。...继承 关于继承关系如何在数据库中呈现,目前有三种常见的模式: TPH(table-per-hierarchy):一张表存放基类和子类的所有列,使用discriminator列区分类型,目前EF Core...):基类和子类不在同一个表中,子类中包含基类的所有字段,目前EF Core不支持该模式 EF Core仅支持TPH模式,基类和子类数据将存储在同一个表中。

    3.1K20

    在NHibernate的单表继承模式下通过父类Repository查询子类

    使用单表继承可以不用Join多个表查询效率高,而且在Domain Model的属性提示到父类或者下降到子类时,数据库模型不用更改。...其缺点就是一个数据表的列比较多,而且很多列为空,不过现代的数据库对空列的压缩处理已经比较好了,不会产生大量空列造成的性能问题和磁盘空间的浪费。...在NHibernate中经常会遇到通过父类的Repository来查询子类的情况,比如现在有一个抽象的Employee对象,下面有OfficeUser和Teacher两个具体的对象,这两个对象都有其特有的属性...我们可以将OfficeUser和Teacher都保存到Employee表中,然后建立了一个EmployeeRepository,使用Employee作为Query的入口,那么如果要查询Employee表中所有的...Teacher,虽然这在C#中是一回事,但是NHibernate会对其理解不一样,所以必须这么写,否则查询不出来。

    35820

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

    ShardingCore - EF Core分表分库读写分离的扩展。...PgSql 的数组类型等; 支持 丰富的表达式函数,以及灵活的自定义解析; 支持 导航属性一对多、多对多贪婪加载,以及延时加载; 支持 读写分离、分表分库、过滤器、乐观锁、悲观锁; 支持 MySql/...主要特点: 与Dapper一样,它很快,因为它使用动态方法生成 (MSIL) 将列值分配给属性。 像Massive一样,它现在也支持动态 Expandos。...与Massive一样,它以单个文件的形式提供,您可以轻松地将其添加到任何项目或编译(仅限 V5)。...内存高效- 它提取并缓存您的对象属性、执行上下文、对象映射和 SQL 语句。它在整个转换和执行过程中重用它们。 动态和混合- 它提供了成熟 ORM 的一些高级功能。

    5.9K11
    领券