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

Fluent NHibernate - 如何将外键列映射为属性

您好!您提到的 Fluent NHibernate 是一个用于 NHibernate 的映射框架,它允许您使用代码而不是 XML 文件来映射数据库表和实体。Fluent NHibernate 提供了一种更简洁、更具可读性的方式来定义您的映射,并且可以更好地利用 C# 的特性。

在 Fluent NHibernate 中,将外键列映射为属性可以通过以下方式实现:

  1. 首先,定义您的实体类,例如:
代码语言:csharp
复制
public class Order
{
    public virtual int Id { get; set; }
    public virtual Customer Customer { get; set; }
    public virtual IList<OrderItem> Items { get; set; }
}

public class OrderItem
{
    public virtual int Id { get; set; }
    public virtual Order Order { get; set; }
    public virtual Product Product { get; set; }
    public virtual int Quantity { get; set; }
}

public class Product
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual decimal Price { get; set; }
}
  1. 接下来,使用 Fluent NHibernate 的映射 API 来定义您的映射:
代码语言:csharp
复制
public class OrderMap : ClassMap<Order>
{
    public OrderMap()
    {
        Id(x => x.Id);
        References(x => x.Customer);
        HasMany(x => x.Items);
    }
}

public class OrderItemMap : ClassMap<OrderItem>
{
    public OrderItemMap()
    {
        Id(x => x.Id);
        References(x => x.Order);
        References(x => x.Product);
        Map(x => x.Quantity);
    }
}

public class ProductMap : ClassMap<Product>
{
    public ProductMap()
    {
        Id(x => x.Id);
        Map(x => x.Name);
        Map(x => x.Price);
    }
}

在上面的代码中,References 方法用于定义外键列,HasMany 方法用于定义一对多关系。

  1. 最后,将您的映射配置应用到 NHibernate 的配置中:
代码语言:csharp
复制
var configuration = new Configuration();
configuration.Configure();
configuration.AddMappingsFromAssembly(typeof(OrderMap).Assembly);

这样,您就可以使用 Fluent NHibernate 将外键列映射为属性了。

需要注意的是,Fluent NHibernate 是一个非常强大的映射框架,它提供了许多其他的映射选项和功能,例如自定义类型、组合类型、级联操作等等。如果您需要更多的信息和示例,请参考 Fluent NHibernate 的官方文档。

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

相关·内容

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

由于在项目中使用了NHibernate来作为ORMapping构建数据访问层,那么就必须要配置Object和DataTable的映射。...,我们使用了Fluent NHibernate的Mapping方式代替XML配置。...使用Fluent NHibernate的最大好处是降低了出错的机会,因为Fluent Nhibernate的配置是使用C#来编写,可以智能感知,而且还能编译,不像原始的XML配置,写错了都不知道。...(比如CostCenter中有public virtual long Id{get;set;},对应表中的COST_CENTER_ID) 对于一对多的关系,使用父方的类名作为属性名,表中使用父表的主键列名作为对应的的列名...childType = instance.ChildType; if (entityType == childType)//这里是专门对自身关联一对多的情况进行特殊处理,统一使用PARENT_ID作为

1.1K10

连贯NHibernate 1.0正式发布

连贯NHibernateFluent NHibernate) 是通过编程方式而不是使用XML配置文件创建NHibernate映射的API。...它的目标是在项目中运用NHibernate时减少所遇到的困难,提供更好的可读性、可测试性和编译时的安全性。...连贯NHibernate降低了复杂性,并进一步加强了约定胜于配置的原则,即任何一个映射的最常用设置是默认的。 除了编译时的检查连贯NHibernate还为你的映射的测试提供了一个健壮的API。...Wiki上有教程告诉怎么用,园子里的inday的几篇文章可以先看一下: [原创]Fluent NHibernate之旅 [原创]Fluent NHibernate之旅二--Entity Mapping...[原创]Fluent NHibernate之旅(三)—继承 codeproject上也有一篇针对RC的文章:Fluent NHibernate and Linq2NHibernate – Demo Project

61370

Fluent NHibernate之旅二--Entity Mapping

本节内容: 简单实体映射 使用自定义类型映射实体属性 NHibernate的实体映射(Entity Mapping)做的非常好,虽然不是完美,但一些我们经常使用的,基本上已经都支持了,而且配置也相对比较简单...对于我这种新手来说,Fluent更适合我,因为我可以用它来进行学习NHibernate映射做好了,接下来我们在NHibernate中把映射加到配置中。...二、使用自定义类型映射实体属性 NHibernate支持我们用自定义的类型来映射属性,但因为我是初学,我真的不会,当然我在网上找到了相关的资料,在此也不多说,就说说Fluent的方式吧,在我映射自定义属性的时候...在Order实体中,我们看到了订单状态我用了OrderState枚举类型,数据库存储类型tinyint,对于它的映射,我们只需要: public class OrderMap : ClassMap<Order...前几天的开篇“Fluent NHibernate之旅一”,反响不是很好,或许大家用NHibernate的真的很少,或许我写的不够好,或许。。。。

98090

Fluent NHibernate之旅(三)-- 继承

经过了“开篇”和“简单映射”两篇文章,相信大家对Fluent NHibernate 有了一定的了解了,FluentNHibernate实际就是对 NHibernate 映射的一定扩展,我们能完全利用强类型...从这一篇开始,我们将使用Fluent NHibernate RC 1.0 版来进行演示,先前的代码,我会另外进行说明 继承 在OOP中,继承作为OO中重要的特性,如果NHibernate没有对它的支持,...在说一下DiscriminateSubClassesOnColumn,这就是标识符的一个映射方式,因为在RC版之前,我们可以使用SetAttribate的方法,设定我们的父类"not-null" 但是在...Table per subclass 在这种方式中,一个父类表包括了一些共同的属性,子类表除了主键,就只有属于自己的属性。...总结 这次说了一下继承的映射方式,其实很早就写好了,正好遇到Fluent NHibernate发布了RC版,所以用了一些时间去学习了下,总的来说,这次升级呢非常好,可能会存在更多的bug,但不影响我们的正常使用

64280

Fluent NHibernate之旅

ORM大家都非常熟悉了吧,我相信也有很多朋友正在用自己或者一些公开的框架,而最常用而且强大的,非Hibernate了(Net中NHibernate),网上的文档非常多,不过在博客园中,介绍NHibernate...的非常少,李哥的NHibernate系列(NHibernate之旅)不失一个经典,对于新手的我们,需要完全掌握还需要很长一段路,对于新手来说,最初的配置是非常头大的一件事情,好在老赵推荐一个开源的框架...这是官方的说明,大体的话也就是用编程的方式进行配置,让你能更好的理解,不需要编写复杂的映射文件,它能完全替换NHibernate映射文件,让你在映射的时候能使用C#的强类型方式。...sessionFactory { get; set; } 传统的方式其实已经非常灵活和简单了,但配置文件真的有点头大,那么多的属性...原本打算把Fluent学习的方法说一下,后来一看,必须要先说Fluent的Mapping才能说到这个,所以暂时先不说了,等到下一章映射的部分再一起来说。

1K60

Fluent NHibernate RC 1.0 --升级内容

Fluent NHibernate Release Notes 1.0 : http://wiki.fluentnhibernate.org/Release_notes_1.0 FNT在映射的时候,分为...Fluent Mapping(手动)和Auto Mapping(自动)两种方式,我在我的“Fluent系列”中一直使用的是手动方式,我觉得相对应的好控制,而且也让我同时能更好的学习NHibernate。...这一次他们完全丢弃了SetAttribute方法,完全依赖Fluent的方式来进行实体映射,所以很多特性我也不知道如何来映射,不过这时候你还是可以区GoogleGroups求助一下,强烈建议大家把它收藏一下吧...RC版中,SubClass和JoinSubClass的映射,都要继承SubclassMap,很多属性和方法都跟ClassMap一样,它有自己的一些属性和方法,比如DiscriminatorValue...3、忽略属性(IgnoreProperty),这个不错,在以前,我们自动映射的时候每个属性不管要不要都映射了,在RC版,我们可以使用如下代码,忽略这些属性不进行映射,非常不错,赞一个。

62050

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

Fluent NHibernate之旅系列导航: 一、开篇:ISessionFactory Configuration 二、实体映射:Entity Mapping 三、继承映射:Inheritence...映射 不得不赞叹一下 Fluent Nhibernate ,有了它,我们的映射一切都变得如此简单,先来看看Model吧,用户的订单列表,对于用户来说,暂时是不需要排序的,所以我们可以使用ISet作为Order...Assert.NotNull(user); Assert.Equal(true, user.Orders.Any()); } 这里为什么没有在using中进行测试,就是为了表示,我们立即加载了Orders属性...我们在Output中,能看到NHibernate生成的Sql语句,测试也成功,说明我们刚刚是立即加载了Orders属性。...如果您在使用Fluent Nhibernate的时候也遇到了问题,可以及时与我联系或求助于Fluent 的Google Groups。 应“亦续缘”的要求,我把代码整理了下,发上来,便于大家学习。

686100

NHibernate 代码映射实体类

NHibernate 代码映射实体类 关于代码映射 NHibernate 3.2 自带了代码映射机制, 作为 xml 映射之外的一种映射方式, 由于推出的时间比较晚, 所以资料相对比较少, 而且与社区版的...Fluent Mapping 和 Attribute Mapping 不同, 有其独特的设计风格。...下面就通过一个实例来说明怎么使用 NHibernate 自带的代码映射。 实体关系 要映射的类关系图如下: ?...使用 Property 函数映射属性NHibernate 提供了内置的工具类来简化代码: Property( m => m.Name, map => { map.Column...Attribute Mapping 相比, 对原来的 POCO 实体类没有污染 (Attribute) ; NHibernate 自带, 可以说是一等公民, 而 Fluent Mapping 是第三方维护的

86510

Entity Framework 系统约定配置

在EF中是以一种约定的方式进行表、同实体类进行映射的,与此同时为了提高最大的灵活性EF中可以通过Fluent API和Data Annotations两种方式对映射进行灵活配置。...3.使用导航属性约束两个表之间的关系,在从表数据类中除了导航属性,推荐定义一个属性在从表数据类中(如果不指定将默认生成一个“+”的;此外在主表中推荐定义一个集合从表属性用户导航...,当然这个属性不定义也可以正常生成关系但是不利于使用),具体规则:“+”或者“+”又或者“”,其属性名不区分大小写并且如果出现多种匹配按照先后顺序匹配...;如果不存在外属性关系注册可选的,否则注册必选项并且此时将设置级联删除关系;如果在从表类中有多个导航属性对应同一个数据类那么需要使用fluent API或者Data Annotations进行手动配置...4.当EF按照上述规则在数据类中没有找到主键属性时(或者通过fluent API、Data Annotations没有定义)将认为此类“复杂类型”。

81420

EntityFramework Core 学习扫盲

Fluent API [HasKey] Fluent Api方式中的HasKey方法可以将属性映射为主键,对于复合主键(多个属性组合而成的主键标识)也可以很容易地进行表示。...在Fluent Api中,有两种方法可以指定备用,一种是当开发者将实体中的属性作为另一个实体的目标,另一种是手动指定。EF CORE的默认约束是前者。...Blog对应Post的,指定Blog实体中的Url属性作为备用(HasPrincipalKey方法将在下文的唯一标识节中讲解),此时Url将被配置唯一,扮演BlogId的作用。...备用 备用在之前的小节中已经提过,使用以下代码配置的将自动设置唯一标识。...虽然主体也包括主键,但是主键在EF CORE中时强制定义的,所以HasPrincipalKey只会将属性配置备用。 2.

9.5K90

Entity Framework 约定

如果主键类型是***int*** 或者 guid 类型,主键将会被映射自增长标识。...EF中定义关系要使用到导航属性,通过导航属性可以定义多个模型之间的关系。大部分情况下我们会将导航属性属性结合在一起使用。...当EF检测出外属性后,会根据属性是否空来判断关系,如果可以为空,那么模型之间的关系将会配置成可选的,Code First 不会再关系上配置级联删除。...简单的说就是:一个复杂类型作为已存在对象的属性,EF会将复杂类型的类映射到已存在的表中,已存在的表包将包含这些,而不是将复杂类型映射成另外单独的一张表。...如果项目要求模型中有Id属性,就将Id作为主键映射,那么我们有两种选择来定义这个约定,首先我们而已选择Fluent API ,其次我们也可以选择自定义约定。

1.3K10

近期开发中遇到的问题总结

1、EF5利用NuGet升级到EF6后,一些Attribute冲突[未解决]:       我原先的数据驱动使用的是Fluent Nhibernate +Nhibernate+MSSQL2005...不支持存储过程       一直以为没有使用FN进行存储过程的操作,这次因为后台首页想统计下数据,就利用了存储过程,但在使用中却发现FN目前还不支持存储过程(点击查看官方),没有办法,只能利用Fluent...这里要注意的是: a)存储过程返回的数据,最好重新定义一个class,并且进行映射(可以使用FN或者HDM方式) b)把新定义的class和映射的hbm文件,放到你的Model层,这是为了方便以后的管理...c)映射存储过程的hdm文件名,以返回类型的名称命名。...,返回类型序列化冲突: 因为用的新模板很炫,想把数据请求都使用Web Api来进行,但在使用的时候,返回的json数据中,都返回了k_BackingField,这下傻了,查看了文档,说在属性或者字段标记中

820100

C# 数据操作系列 - 6 EF Core 配置映射关系

对于其他属性,EF会自动按照同名的形式映射到数据表中。 对于,如果在类里添加了引用类型,而这个引用类型也在EF的上下文中,EF会把这种属性称为导航属性。...EF一旦在类里检索到了导航属性,就会去寻找对应的。EF会认为 属性名+Id或者类名+Id 可能是属性,如果找到名称一致且类型与导航属性目标类的主键类型一致,则认为是。...如果没找到符合名称要求的属性,EF会自己添加一个属性。 对于一对一,EF要求导航属性双方都应该具有配置。 一对多,EF要求多的一方设置。...同时如果在一方这边设置了集合类型的导航属性,那么EF会自动到目标类里寻找属性。 说完了一对一和一对多,那么多对多呢? 如果没有声明的话, EF会生成一个中间表。 2....总结 在这一篇领着大家看了一下EF Core对于映射关系这一部分的内容,我留下了相关的FluentAPI介绍,我打算在下一篇介绍。因为这部分的内容比较麻烦,而且使用率也相当高。

2.6K21

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

Fluent Nhibernate(以下简称FN)发展到如今,已经相当成熟了,在Nhibernate的书中也相应的推荐了使用FN来进行映射配置,之前写的FN之旅至今还有很多人会来私信我问题,说来惭愧,从...Mapping 五、一对多映射:One-to-Many Mapping 六、Fluent NHibernate之旅(四)-- 关系(下) 安装 现在在项目中使用FN很方便,使用Nuget管理就可以了...因为这里考虑到一些契约的问题,它的Add参数AutoPersistenceModel类型,接下来会说的。 数据库结构 接下来,我们设计一个数据库结构,简单点: ?...刚我们的测试报错,是因为Employee中的Name是个UserName类,Nhibernate的Component,我在FN之旅四(上)中有介绍到,默认情况下映射根据字段映射到数据库的,所以上面的测试会报错...Fluent Nhibernate确实是个好东西,让我在开发上省去了很多时间,今天虽然介绍了AutoMapping,但我不推荐您在您的项目中使用,用起来没手感(个人感觉),需要约定的东西太多了,对于数据库结构也得按照他的契约来

92060

对象的继承关系在数据库中的实现方式和PowerDesigner设计

在面向对象的编程中,使用对象的继承是一个非常普遍的做法,但是在关系数据库管理系统RDBMS中,使用的是表示实体(表)之间的关系,那么对于继承关系,该怎么在RDBMS中表示呢?...不建立父对象,将父对象的所有属性转移到子对象中,每个子对象建立对于的表。...对父对象和每个子对象建立一个对应的表,然后在子表中设置该子表的主键与父表关联的。...如图所示: 生成的数据库表如图所示: 这里可以看到,Teacher的主键和Student的主键同时又是该表的,连接到Person表。...PS:如果使用NHibernate进行编程,那么可以参考这篇文章,介绍了NHibernate对这三种继承的配置方法。 如果使用Entity Framework进行编程,那么可以参考这篇文章。

67810

EF Code First 学习笔记:关系

很多情况下我们都不需要特意的去配置,Code First就能通过一些引用属性、导航属性等检测到模型之间的关系,自动我们生成。...,同时Destination中又有一个集合导航属性Lodgings,因此推测出Destination与Lodging的关系是一对多关系,所以在生成的数据库中自动Lodging表生成: ?...默认情况下,如果你的命名是规范的话,Code First会将的该属性设置,不再自动创建一个,如: public class Destination { public...这时我们要告诉Code First该属性是一个。...天哪,竟然生成了四个。因为有两套类型一样的导航属性与引用属性,Code First无法确定它们之间的对应关系,就单独每个属性都创建了一个关系。

72910
领券