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

NHibernate:使用Fluent Nhibernate来保存子对象

您好!感谢您提供的问答内容。NHibernate是一个.NET平台的对象关系映射(ORM)框架,它允许开发人员使用简单的方式将数据库表与.NET对象进行映射。Fluent NHibernate是一个NHibernate的扩展库,它提供了更简洁、更灵活的映射方式,而不是使用传统的XML或属性映射。

在使用Fluent NHibernate来保存子对象时,您需要遵循以下步骤:

  1. 首先,确保已经安装了Fluent NHibernate和NHibernate的NuGet包。
  2. 定义您的实体类,包括父对象和子对象。
  3. 创建一个映射类,继承自ClassMap<T>,并在该类中定义父对象和子对象的映射关系。
  4. 在映射类中,使用HasMany()或HasManyToMany()方法来映射子对象的集合属性。
  5. 使用FluentConfiguration对象来配置NHibernate的SessionFactory。
  6. 使用ISession对象来保存或查询父对象和子对象。

以下是一个简单的示例:

代码语言:csharp
复制
public class ParentMap : ClassMap<Parent>
{
    public ParentMap()
    {
        Id(x => x.Id);
        Map(x => x.Name);
        HasMany(x => x.Children)
            .KeyColumn("ParentId")
            .Cascade.AllDeleteOrphan();
    }
}

public class ChildMap : ClassMap<Child>
{
    public ChildMap()
    {
        Id(x => x.Id);
        Map(x => x.Name);
        References(x => x.Parent);
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        var sessionFactory = Fluently.Configure()
            .Database(MsSqlConfiguration.MsSql2012.ConnectionString("..."))
            .Mappings(m => m.FluentMappings.AddFromAssemblyOf<ParentMap>())
            .BuildSessionFactory();

        using (var session = sessionFactory.OpenSession())
        {
            using (var transaction = session.BeginTransaction())
            {
                var parent = new Parent { Name = "Parent 1" };
                parent.Children.Add(new Child { Name = "Child 1" });
                parent.Children.Add(new Child { Name = "Child 2" });

                session.Save(parent);

                transaction.Commit();
            }
        }
    }
}

在这个示例中,Parent和Child是父对象和子对象的实体类,ParentMap和ChildMap是它们的映射类。在ParentMap中,使用HasMany()方法来映射子对象的集合属性,并指定ParentId作为外键。在ChildMap中,使用References()方法来映射父对象的属性。

最后,在Program类中,使用Fluently.Configure()方法来配置SessionFactory,并使用ISession对象来保存父对象和子对象。

希望这个答案能够帮助您解决问题!

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

相关·内容

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

,我们使用Fluent NHibernate的Mapping方式代替XML配置。...使用Fluent NHibernate的最大好处是降低了出错的机会,因为Fluent Nhibernate的配置是使用C#编写,可以智能感知,而且还能编译,不像原始的XML配置,写错了都不知道。...Fluent NHibernate的配置方式仍然是需要编写Mapping代码的,也就意味着,如果我更改class或者DataTable的时候,还要对应的更改该Mapping文件。...更多的修改意味着更多的风险,为了减少这方面的风险,同时为了减少配置的工作量,所以在最新的项目中采用了Fluent NHibernate中的Automapping。...virtual Class Class{get;set;}) 对于SubClass,采用将多个子对象都存在同一个表中的方式实现,使用“TYPE”列作为DiscriminatorColumn,使用之类的类名作为子类的唯一标识

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

64670
  • Fluent NHibernate之旅

    本篇内容: 1、初识Fluent NHibernate(简称Fluent) 2、使用NHibernateFluent创建ISessionFactory 3、传统方式和Fluent的对比。...下载地址:http://fluentnhibernate.org/ 二、使用NHibernateFluent创建ISessionFactory 准备工作: 1、下载Fluent类库,其中已经包含了NHibernate...在NHibernate中,ISession是操作数据的核心,我们需要通过SessionFactory建造ISession进行数据的交互。...当然不,Fluent的开发者不仅帮你保留了原有的方式,还可以混合你的配置文件,最有意思的时,你还可以使用学习NHibernate,甚至可以使用开发你自己的自动代码生成工具,因为我也刚学,先介绍一些简单的...使用NHibernate的配置      也就是你可以按照原先的方式进行配置,而读取呢使用Fluent读取,然后创建SessionFactory,或许你感觉这不是多余了嘛,那是因为还没有讲到Mapping

    1.1K60

    Fluent NHibernate之旅二--Entity Mapping

    如果你要体验NHibernate的强大,首先你就要学会配置,包括SessionFactory和Mapping的配置。今天跟上一篇一样,会使用传统方式和 NHibernate 进行讲解。...本节内容: 简单实体映射 使用自定义类型映射实体属性 NHibernate的实体映射(Entity Mapping)做的非常好,虽然不是完美,但一些我们经常使用的,基本上已经都支持了,而且配置也相对比较简单...对于我这种新手来说,Fluent更适合我,因为我可以用它进行学习NHibernate。 映射做好了,接下来我们在NHibernate中把映射加到配置中。...二、使用自定义类型映射实体属性 NHibernate支持我们用自定义的类型映射属性,但因为我是初学,我真的不会,当然我在网上找到了相关的资料,在此也不多说,就说说Fluent的方式吧,在我映射自定义属性的时候...为了接下来的方便,我把Fluent的Mapping都生成到我传统方式的Mapping目录中,加入到项目,设置成嵌入的资源,一切都为了以后的教程,换句话说以后的教程中,我一般都会使用Fluent进行映射

    1K90

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

    Fluent Nhibernate(以下简称FN)发展到如今,已经相当成熟了,在Nhibernate的书中也相应的推荐了使用FN进行映射配置,之前写的FN之旅至今还有很多人会来私信我问题,说来惭愧,从...NHibernate之旅(四)-- 关系(下) 安装 现在在项目中使用FN很方便,使用Nuget管理就可以了,但我还是建议大家,可以下载源代码,自己可以详细了解下。...,您需要按照一定的规范编写您的对象。...用ExposeConfiguration方法委托Nhibernate的SchemaExport创建数据库架构,相信很多NH玩家都会用吧。...Fluent Nhibernate确实是个好东西,让我在开发上省去了很多时间,今天虽然介绍了AutoMapping,但我不推荐您在您的项目中使用,用起来没手感(个人感觉),需要约定的东西太多了,对于数据库结构也得按照他的契约

    97060

    Fluent NHibernate之旅(三)-- 继承

    经过了“开篇”和“简单映射”两篇文章,相信大家对Fluent NHibernate 有了一定的了解了,FluentNHibernate实际就是对 NHibernate 映射的一定扩展,我们能完全利用强类型...从这一篇开始,我们将使用Fluent NHibernate RC 1.0 版进行演示,先前的代码,我会另外进行说明 继承 在OOP中,继承作为OO中重要的特性,如果NHibernate没有对它的支持,...因为需要标识符,所以我们必须添加一个标识符,我这里使用枚举类型表示,代码改变成如下: public enum ProductType { Mobile, Book } public...,好的做法是把子类映射区分开来,等一下你会知道,第一种策略和第二种策略都会采用这样的方式进行映射,至于映射会使用subclass还好是join-subclass,FluentNHibernate会自动生成的...总结 这次说了一下继承的映射方式,其实很早就写好了,正好遇到Fluent NHibernate发布了RC版,所以用了一些时间去学习了下,总的来说,这次升级呢非常好,可能会存在更多的bug,但不影响我们的正常使用

    69680

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

    Fluent NHibernate之旅系列导航: 一、开篇:ISessionFactory Configuration 二、实体映射:Entity Mapping 三、继承映射:Inheritence...映射 不得不赞叹一下 Fluent Nhibernate ,有了它,我们的映射一切都变得如此简单,先来看看Model吧,用户的订单列表,对于用户来说,暂时是不需要排序的,所以我们可以使用ISet作为Order...一对多的映射,比起一对一说还相对的简单点,默认是延迟加载,如果项目中,有些地方,需要立即加载,我们也可以使用 FetchMode.Eager 加载。...我们在Output中,能看到NHibernate生成的Sql语句,测试也成功,说明我们刚刚是立即加载了Orders属性。...如果您在使用Fluent Nhibernate的时候也遇到了问题,可以及时与我联系或求助于Fluent 的Google Groups。 应“亦续缘”的要求,我把代码整理了下,发上来,便于大家学习。

    719100

    C# 数据操作系列 - 12 NHibernate的增删改查

    前言 上一篇《C# 数据操作系列 - 11 NHibernate 配置和结构介绍》 介绍了Nhibernate里的配置内容。这一篇将带领大家了解一下如何使用NHIbernate。...之前提到NHibernate继承了Hibernate的一些传统:使用XML文件进行配置,这一点也是备受争议。...不过,有社区爱好者开发了一个名为《Fluent NHibernate》的项目,用来支持NHibernate的流式配置。...2.3 删除 NHibernate的删除也十分简单,直接通知ISession删除某个持久化对象。...总结 嗯,NHibernate基础使用篇到这里可以暂告一段落了。后续的内容有机会再深挖,当然并不代表EF Core就没有了。嗯嗯,没毛病。下一篇就让我先替大伙看看SugarSQL是什么情况吧。

    1.1K20

    NHibernate 代码映射实体类

    下面就通过一个实例来说明怎么使用 NHibernate 自带的代码映射。 实体关系 要映射的类关系图如下: ?...Table 函数将类映射到制定的数据表: Table("product"); 标识映射 使用 Id 函数映射标识, NHibernate 提供了内置的工具类简化代码: Id( m => m.Id...Property 函数映射属性, NHibernate 提供了内置的工具类简化代码: Property( m => m.Name, map => { map.Column...总结 与 xml 映射以及其它第三方映射相比, 使用 NHibernate 代码映射有下面几个优点: 不需要使用 xml 文件即可完成, 可以充分利用 IDE 智能提示, 重构, 以及编译时检查; 与...Attribute Mapping 相比, 对原来的 POCO 实体类没有污染 (Attribute) ; NHibernate 自带, 可以说是一等公民, 而 Fluent Mapping 是第三方维护的

    90510

    Fluent NHibernate RC 1.0 --升级内容

    Fluent NHiberante(FNT) RC 1.0 已经在上个星期发布了,其中很多东西被废弃,有些方法改进,还有一些命名更贴切,虽说不是很完美,但已经做的非常完善了,如果大家在使用中,发现bug...Fluent NHibernate Release Notes 1.0 : http://wiki.fluentnhibernate.org/Release_notes_1.0 FNT在映射的时候,分为...Fluent Mapping(手动)和Auto Mapping(自动)两种方式,我在我的“Fluent系列”中一直使用的是手动方式,我觉得相对应的好控制,而且也让我同时能更好的学习NHibernate。...这一次他们完全丢弃了SetAttribute方法,完全依赖Fluent的方式进行实体映射,所以很多特性我也不知道如何来映射,不过这时候你还是可以区GoogleGroups求助一下,强烈建议大家把它收藏一下吧...3、忽略属性(IgnoreProperty),这个不错,在以前,我们自动映射的时候每个属性不管要不要都映射了,在RC版,我们可以使用如下代码,忽略这些属性不进行映射,非常不错,赞一个。

    65050

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

    1、EF5利用NuGet升级到EF6后,一些Attribute冲突[未解决]:       我原先的数据驱动使用的是Fluent Nhibernate +Nhibernate+MSSQL2005...,这次因为后台首页想统计下数据,就利用了存储过程,但在使用中却发现FN目前还不支持存储过程(点击查看官方),没有办法,只能利用Fluent Configuration和HBM Configuration...> <hibernate-mapping xmlns="urn:<em>nhibernate</em>-mapping-2.2" assembly="Travel.Domain" namespace="Bus.Travel...的方式进行<em>使用</em>了。...3、在<em>使用</em>Web Api的时候,返回类型序列化冲突: 因为用的新模板很炫,想把数据请求都<em>使用</em>Web Api<em>来</em>进行,但在<em>使用</em>的时候,返回的json数据中,都返回了k_BackingField

    867100

    NHibernate详解

    Nhibernate 来源于非常优秀的基于Java的Hibernate 关系型持久化工具。 NHibernate 从数据库底层持久化你的.Net 对象到关系型数据库。...经过以上标准步骤,我们下一步是写一个.Net类处理一个给定的User对象。 第二步:产生一个.Net 类文件 当内存中有一堆User对象的时候,我们需要某种对象保存它们。...不是必要的.它可以使用public, protected, internal或者甚至是用private持久化数据。...那里有一堆属性你需要调整确定如何让NHibernate来访问数据库。再次说明,你可以在文档里获取更多信息。 NHibernate使用log4net记录内部发生的一切。...现在可以在你的代码中恰当简洁的使用NHibernate。简化的版本如下 1. 创建一个Configuration对象 2.

    68530

    Nhibernate入门与demo

    学习和使用Nhibernate已经很久了,一直想写点东西和大家一起学习使用Nhibernate。博客园里也有很多大牛写了很多关于Nhibernate入门的文章。...本篇文章阅读对象是:Nhibernate初学者!如果你是Nhibernate的研究者或者已经很熟练的运用Nhibernate请不吝赐教,对本文不足之处进行指教。      带着问题去学习!...3、怎么搭建Nhibernate?      4、怎么使用Nhibernate?      好,我们就带着这几个问题开始我们的Nhibernate的旅程。    ...先看一张经典的图:      ORM:对象关系映射(O/R Mapping,Object Relational Mapping)表示一种技术,用来把对象模型表示的对象映射到基于SQL 的关系模型数据结构中去...第四个问题:         使用和测试你的配置【可以爽一把了!】

    35430

    NHibernate教程

    一、NHibernate简介 在今日的企业环境中,把面向对象的软件和关系数据库一起使用可能是相当麻烦、浪费时间的。NHibernate是一个面向.Net环境的对象/关系数据库映射工具。...二、NHibernate使用步骤 1.为系统引入NHibernate的库,并且配置NHibernate; 2.新建一个将要持久化.Net对象的表; 3.构建一个需要被持久化的.Net类; 4.构建一个可以让...NHibernate知道如何完成ORM映射的XML文件; 5.使用NHibernate的API编程 三、NHibernate使用 1....如果使用的是WinForm,将如下文本保存为App.config放到程序启动目录就可以。如果是WebForm,则将下面的文本添加到web.config中 <?...创建一个用于测试的表 这里需要创建3张表,分别用于保存:学生、课程、选课信息。可以用Sql语句创建,也可以用其他方式创建。

    36910

    C#——Nhibernate探索

    C#—Nhibernate探索 本篇文章,让我们一起探索Nhibernate。 首先我们去搜索Nhibernate下载地址,如下链接所示。 该版本可能是最新版,我下载的4.0.4.GA。...一、建立了一个类库程序,引用Iesi.Collections.dll和NHibernate.dll两个DLL。  接下来,我们开始建立持久化对象。...调查结果: 对象与数据库的映射是保存在XML文件中的,于是我配置XML映射文件如下。 该XML文件的属性,要求设置其生成操作为【嵌入的资源】。 但我怕它丢失,还给他设置了始终复制的属性。...可以顺利使用。  结语 这是一场Nhibernate探索之旅,结果是非常顺利的配置成功了。共耗时2小时。...为什么说是探索之旅呢,因为,我也是首次配置Nhibernate,我平常更多的是使用Entity Framework。 文中使用了一些推断,猜测的词语。那是因为,真的是在推断的。

    49430

    NHibernate中关于Inverse的理解和使用

    使用NHibernate进行数据库操作的时候,比如数据插入的时候,经常用到级联功能,比如最常见的就是一个订单对应多个明细行,在保存订单时只需要Save订单对象即可,订单下的所有明细行会级联保存。...如果在Mapping配置Order的Item时设置inverse="true",那么NHibernate就会使用OrderItem的Order引用作为关联。...【注意:这里是说最终结果,而不是中间结果,在Insert OrderItem的时候,其OrderId为该对象对应的Order对象的Id,如果该Order对象保存,则OrderId为null,如果是已保存的...如果我们再调整下保存的顺序,先保存D2,然后再保存D1,那么对应的SQL是: NHibernate: INSERT INTO DEPARTMENT (NAME, DEPARTMENT_ID) VALUES...总结: Inverse用于设置双向关联时Nhibernate在设置外键时依赖的对象,默认Inverse=False,一对多时表示依赖一端的集合,如果为True表示依赖多段对象中对一端对象的引用。

    46630

    NHibernate 缓存

    注意最后一句, 明确说明了一级缓存的用途: 在对象树种导航、浏览时, 使用一级缓存; 根据对象的 id 加载对象; 由此可以看出, 一级缓存的作用是比较有限的, 但是也有用得着的地方。...一级缓存测试 一级缓存缓存无需配置, 默认支持, 因此, 在使用 session 查询对象, 如果仅仅是根据 id 加载指定的对象, 需要使用 session 的 Get 或 Load 方法, 这样可以充分利用...测试Query 根据文档的描述, 用 session 查询对象, 应该是不能利用一级缓存的, 我们测试一下: [Test] public void TestSessionLambdaQuery() {...注意: 如果查询时不想使用一级缓存, 可以 StatelessSession 对象, 和 Session 对象用法一样, 只是该对象没有一级缓存。...一级缓存管理 一级缓存的管理也是很简单的, 可以通过下面的三个方法管理: session.Evict 从一级缓存中删除指定的实例; session.Clear 清空一级缓存, 不会保存修改的内容; session.Contains

    60311
    领券