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

如何在nhibernate中从动态创建的类型中获取行

在NHibernate中,可以使用反射来从动态创建的类型中获取行。NHibernate是一个开源的对象关系映射(ORM)框架,它提供了一种将对象模型映射到关系数据库的方式。

要从动态创建的类型中获取行,可以按照以下步骤进行操作:

  1. 创建动态类型:使用C#的System.Reflection.Emit命名空间中的类,如AssemblyBuilder、ModuleBuilder、TypeBuilder等,可以在运行时动态创建类型。可以根据需要定义类型的属性和方法。
  2. 创建NHibernate映射文件:使用NHibernate的映射文件(.hbm.xml)来定义动态类型与数据库表之间的映射关系。在映射文件中,可以指定表名、列名、主键等信息。
  3. 配置NHibernate:在NHibernate的配置文件(如hibernate.cfg.xml)中,配置数据库连接字符串、映射文件路径等信息。可以使用NHibernate的Configuration类来加载配置文件。
  4. 创建会话工厂:使用NHibernate的SessionFactory类,根据配置文件创建一个会话工厂。会话工厂是一个重量级的对象,通常在应用程序启动时创建一次即可。
  5. 打开会话:使用会话工厂的OpenSession方法,打开一个会话。会话是与数据库交互的主要对象,可以执行查询、插入、更新、删除等操作。
  6. 执行查询:使用会话的CreateQuery方法,创建一个查询对象。可以使用HQL(Hibernate Query Language)或Criteria API来构建查询。
  7. 获取结果:执行查询并获取结果集。如果查询的结果是动态创建的类型,可以使用反射来获取行中的数据。

以下是一个示例代码片段,演示了如何在NHibernate中从动态创建的类型中获取行:

代码语言:txt
复制
// 创建动态类型
AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("DynamicAssembly"), AssemblyBuilderAccess.Run);
ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("DynamicModule");
TypeBuilder typeBuilder = moduleBuilder.DefineType("DynamicType", TypeAttributes.Public);

// 定义属性
PropertyBuilder propertyBuilder = typeBuilder.DefineProperty("Id", PropertyAttributes.None, typeof(int), null);
MethodBuilder getterBuilder = typeBuilder.DefineMethod("get_Id", MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig, typeof(int), Type.EmptyTypes);
ILGenerator getterIL = getterBuilder.GetILGenerator();
getterIL.Emit(OpCodes.Ldarg_0);
getterIL.Emit(OpCodes.Call, typeof(object).GetMethod("GetType"));
getterIL.Emit(OpCodes.Pop);
getterIL.Emit(OpCodes.Ldc_I4_1);
getterIL.Emit(OpCodes.Ret);
propertyBuilder.SetGetMethod(getterBuilder);

// 创建类型
Type dynamicType = typeBuilder.CreateType();

// 创建NHibernate映射文件
string mappingXml = @"<hibernate-mapping xmlns='urn:nhibernate-mapping-2.2'>
                        <class name='DynamicType' table='DynamicTable'>
                            <id name='Id' column='Id' type='Int32'>
                                <generator class='assigned' />
                            </id>
                        </class>
                    </hibernate-mapping>";

// 配置NHibernate
Configuration configuration = new Configuration();
configuration.Configure(); // 加载默认配置文件
configuration.AddXmlString(mappingXml);

// 创建会话工厂
ISessionFactory sessionFactory = configuration.BuildSessionFactory();

// 打开会话
using (ISession session = sessionFactory.OpenSession())
{
    // 执行查询
    IQuery query = session.CreateQuery("FROM DynamicType");
    IList<dynamic> results = query.List<dynamic>();

    // 遍历结果集
    foreach (dynamic result in results)
    {
        // 使用反射获取行中的数据
        int id = result.Id;
        Console.WriteLine(id);
    }
}

在上述示例中,首先使用System.Reflection.Emit命名空间中的类来动态创建一个类型。然后,使用NHibernate的映射文件来定义该类型与数据库表之间的映射关系。接下来,配置NHibernate并创建会话工厂。最后,使用会话执行查询,并使用反射从动态类型中获取行中的数据。

请注意,上述示例中的代码仅用于演示目的,实际使用时可能需要根据具体情况进行调整和扩展。另外,NHibernate还提供了更多高级特性和功能,如缓存、事务管理、延迟加载等,可以根据需要进行深入学习和使用。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云数据库(TencentDB):https://cloud.tencent.com/product/tcdb
  • 腾讯云云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云人工智能(AI):https://cloud.tencent.com/product/ai
  • 腾讯云物联网(IoT):https://cloud.tencent.com/product/iot
  • 腾讯云移动开发(Mobile):https://cloud.tencent.com/product/mobile
  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云区块链(Blockchain):https://cloud.tencent.com/product/bc
  • 腾讯云元宇宙(Metaverse):https://cloud.tencent.com/product/mv
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

何在50以下Python代码创建Web爬虫

有兴趣了解Google,Bing或Yahoo工作方式吗?想知道抓取网络需要什么,以及简单网络抓取工具是什么样?在不到50Python(版本3)代码,这是一个简单Web爬虫!...我们先来谈谈网络爬虫目的是什么。维基百科页面所述,网络爬虫是一种以有条不紊方式浏览万维网以收集信息程序。网络爬虫收集哪些信息?...如果在页面上文本找不到该单词,则机器人将获取其集合下一个链接并重复该过程,再次收集下一页上文本和链接集。...索引意味着您解析(浏览和分析)网页内容并创建一个易于访问且可快速检索 *大型集合(思考数据库或表)信息。...它是在2011年9月使用Python 3.2.2编写和测试。继续将其复制并粘贴到您Python IDE并运行或修改它!

3.2K20

.Net反射(动态创建类型实例) - Part.4

.Net反射(动态创建类型实例) - Part.4 2008-2-18 作者: 张子阳 分类: .Net 框架 动态创建对象 在前面节,我们先了解了反射,然后利用反射查看了类型信息,并学习了如何创建自定义特性...可以说,前面三节,我们学习都是反射是什么,在接下来章节,我们将学习反射可以做什么。在进行更有趣的话题之前,我们先看下如何动态创建一个对象。...注意,本文讨论调用不是将上面动态创建对象由Object类型转换成Calculator类型再进行方法调用,这和“常规调用”就没有区别了,让我们以.Net Reflection 方式来进行方法调用...使用InvokeMember调用方法 我们先看第一种方法,代码很简单,只需要两(注意obj在上节已经创建,是Calculator类型实例): Type t = typeof(Calculator);...总结 本文分三个部分讲述了.Net反射一个应用:动态创建对象和调用对象方法(属性、字段)。

88030

动态数组公式:动态获取某列首次出现#NA值之前一数据

标签:动态数组 如下图1所示,在数据中有些为值错误#N/A数据,如果想要获取第一个出现#N/A数据上方数据(图中红色数据,即图2所示数据),如何使用公式解决?...图1 图2 示例图2所示,可以在单元格G2输入公式: =LET(data,A2:E18,i,MIN(IFERROR(BYCOL(data,LAMBDA(x,MATCH(TRUE,ISNA(x),0...如果想要只获取第5列#N/A值上方数据,则将公式稍作修改为: =INDEX(LET(data,A2:E18,i,MIN(IFERROR(BYCOL(data,LAMBDA(x,MATCH(TRUE,ISNA...,那么上述公式会自动更新为最新获取值。...自从Microsoft推出动态数组函数后,很多求解复杂问题公式都得到简化,很多看似无法用公式解决问题也很容易用公式来实现了。

7010

HIVE基础命令Sqoop导入导出插入表问题动态分区表创建HIVE表脚本筛选CSV非文件GROUP BYSqoop导出到MySQL字段类型问题WHERE子查询CASE子查询

temp.source_sys_key = t0.source_sys_key AND temp.legal_company = t0.legal_company ) where temp.jobid = '106'; // 在创建时候通过从别的表查询出相应记录并插入到所创建...一些常见问题 当MySQL字段类型是datetime类型时候,报了以下异常 Error: java.io.IOException: Can't export data, please check...字段类型是datetime, 根据网上一些资料,说是要指定类型 --map-column-java start_time=java.sql.Timestamp,end_time=java.sql.Timestamp...MySQL,根本不知道什么时候有哪些字段 所以,是将MySQL一些datetime类型改成varchar类型?...WHERE子查询 在hive子查询会有各种问题,这里解决方法是将子查询改成JOIN方式 先看一段在MySQLSQL,下不管这段SQL哪来,我也不知道哪里来 SELECT

15.2K20

NHibernate详解

/> 让我们来看看这个文件让我们感兴趣某些...第一个有趣标签是class。这里我们将映射类型名称(类名,装配件)到我们数据库User表,这里和Hibernate有一点点不同。你将不得不告诉NHibernate从何处提取对象。...如果你执意要NHiberante为你生成主键,你感兴趣于设定uuid.hex和uuid.string(文档获取更多信息) 提示:如果你使用Visual Studio.Net 去编译的话,请将user.hbm.xml...你数据库里有一张User表。 现在可以在你代码恰当简洁使用NHibernate。简化版本如下 1. 创建一个Configuration对象 2....让Configuration知道你将存储何种类型对象 3. 为你选择数据库创建一个Session对象 4. Load,Save和Query你对象 5.

57330

Nhibernate_nhibernate与ef区别

开发过程 HNibernate将会有一些工具帮助你,:生成schema,根据映射文件(Mapping file)生成类,并更新schema(一个新开发者建议).然而,在本文档,前提是你已经手动数据库创建喝...这里是我们要做: 1. 在数据库创建把.Net类持久化对应表. 2. 创建需要被持久化.Net类. 3....:第一个tag是class,这里我们把类型名(类名和Assembly名)映射到数据库user表(这里和hibernate有些不同,我们必须告诉NH这个类哪儿来.这个差异是由.Net和Java Reflect...机制不同引起-zyyang).这种情况下,我们是Assembly NHibernate.Demo.QuickStart载入NHibernate.Demo.QuickStart.User类..NH...这些嵌入Generator标记告诉NH怎样生成Primary Key(NH很方便就能给你生成一个,不管是什么类型,只要你告诉它怎样去做).在我们举例子,把它设置成"assigned",意思是"

56030

Nhibernate_juan benet

开发过程 HNibernate将会有一些工具帮助你,:生成schema,根据映射文件(Mapping file)生成类,并更新schema(一个新开发者建议).然而,在本文档,前提是你已经手动数据库创建喝...在数据库创建把.Net类持久化对应表. 2. 创建需要被持久化.Net类. 3. 创建映射文件,以告诉NH怎样持久化这些类属性. 4....:第一个tag是class,这里我们把类型名(类名和Assembly名)映射到数据库user表(这里和hibernate有些不同,我们必须告诉NH这个类哪儿来.这个差异是由.Net和Java Reflect...机制不同引起-zyyang).这种情况下,我们是Assembly NHibernate.Demo.QuickStart载入NHibernate.Demo.QuickStart.User类..NH...这些嵌入Generator标记告诉NH怎样生成Primary Key(NH很方便就能给你生成一个,不管是什么类型,只要你告诉它怎样去做).在我们举例子,把它设置成”assigned”,意思是”

35850

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

前言 今天是NHibernate第二篇内容,通过上一篇内容,我们初步了解了NHibernate创建和使用。这一篇,我继续探索NHibernate背后秘密。嗯,就是这样。 1....ISession - NHibernate.ISession: 一个单线程、短生命周期对象,表示应用程序和数据持久化之间一个连接。...状态分为以下三种: transient 暂存、临时 该状态对象并没有被持久化上下文捕获到,简单来讲就是刚被创建,还没有数据库/持久化上下文中获取到主键信息。...这种状态通常是数据库获取到数据或者新建数据附加到了上下文中。 detached 游离态 该状态对象是从上下文中分离出来,有了数据库主键,曾经或现在仍然有一条数据库记录与之对应。...总结 这是一篇枯燥乏味说明文,主要介绍了Nhibernate基本内容。下一章我们来试试,如何创建Nhibernate映射配置。

1.1K20

NHibernate总结

NHibernate不仅仅管理.NET 类到数据库表映射(包括.NET 数据类型到SQL 数据类型映射),还提供数据查询和获取数据方法,大幅度减少我们开发时人工使用SQL和ADO.NET处理数据时间...我使用开发环境:Microsoft Visual Studio 2012、SQL Server 2008 、NHibernate。 1、创建项目 (1)     我们新建如下一个项目 ?...,其中People实体类字段要设置为virtual。每个文件详细代码在下面介绍 (2)     在NH.Data层引用Nhibernate相关DLL ?...首先,我们要从ISessionFactory获取一个ISession(NHibernate工作单元)。ISessionFactory可以创建并打开新Session。...ISessionFactory通常是个线程安全全局对象,只需要被实例化一次。我们可以使用GoF23单例(Singleton)模式在程序创建ISessionFactory。

90040

NHibernate实践与模式

NHibernate实践与模式 NHibernate是一款非常优秀O/R mapping开源框架,再还没有.net时候它已经存在于java环境。...CURD操作语句可以源代码看,它是生成是参数形势sql脚本并且支持特别的参数,,oracleto_date,to_char等; 从上图可以看出实现了数据库无关性,开发人员无须关心底层数据库类型...开发步骤 一般我们是在先有数据库表结构情况下,一层一层往上写,先创建数据库表,然后写数据库访问层代码(可以通过一些通用ado.net类库完成 Enterpriselibrary),接下来开始编写业务曾代码...然后再去创建数据库表,和UI部分; 我还是按在有数据表情况下如何用NHibernate作开发 1.用MyGeneration创建实体类和mapping文件选择NHibernate lujan99 1.06...(将session绑定到每个http请求上去), hibernate.cfg.xml(配置信息,包括数据库类型,连接字符窜,加载实体类程序集)。

79740

NHibernate对同一个对象Lazyload要设置一致

NHibernate中出于性能考虑,经常使用Lazyload方式来加载关联对象,关于什么是Lazyload,以及怎么使用,可以参见博客园文章,比如:http://www.cnblogs.com.../lyj/archive/2008/10/28/1321494.html 常用NHibernate.ByteCode.Castle动态代理来实现Lazyload,使用该程序集会在运行时创建实体对应代理类...,如果实体使用了继承关系,并通过NHibernate来映射,那么动态代理类在类型转换时会有问题。...我在调用Flow.Node之前,调用了Task对象,所以NHibernate根据TaskMapping设置,将Node设置为动态代理类,同时将Node缓存到了Session,然后再调用Flow.Node...总的来说,如果在NHibernate中用到了继承类,如果同时用到了Lazyload,那么在转换类型时就可能抛出异常。解决办法就是将Lazyload取消,改为立即加载。

30820

Fluent NHibernate之旅二--Entity Mapping

接着上一篇,今天我们说说ORMMapping。如果你要体验NHibernate强大,首先你就要学会配置,包括SessionFactory和Mapping配置。...映射方式很简单吧,相信大家都能看懂吧,为什么会如此方便呢?这其实就是完全靠了Lambda表达式,大家可以看看老赵.NET框架中委托写法演变谈开去”,就非常清楚了。...映射做好了,接下来我们在NHibernate把映射加到配置。...二、使用自定义类型映射实体属性 NHibernate支持我们用自定义类型来映射属性,但因为我是初学,我真的不会,当然我在网上找到了相关资料,在此也不多说,就说说Fluent方式吧,在我映射自定义属性时候...在Order实体,我们看到了订单状态我用了OrderState枚举类型,数据库存储类型为tinyint,对于它映射,我们只需要: public class OrderMap : ClassMap<Order

99390

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

初期开发过程吸取了NBear与MySoft一些精华并加入新思想,之后参考EF Lambda语法进行大量扩展。 经过数十个版本更新迭代发布全新v2.0版本,支持动态列/表、分库/分表等。...开源地址:https://github.com/dotnet/ef6 六、NHibernate(国外) NHibernate 是一个成熟开源对象关系映射器,适用于 .NET 框架。...开源地址:https://github.com/nhibernate/nhibernate-core 七、ServiceStack/ServiceStack.OrmLite(国外) 简单 .NET 快速...数据库访问库,在 POCO 对象和数据库之间提供了一个简单、轻量、快速且类型安全层。...插入/删除/更新/保存和 IsNew 辅助方法 分页请求会自动计算出总记录数并获取特定页面。 简单交易支持。 更好参数替换支持,包括对象属性获取命名参数。

3.9K41

NHibernate学习笔记之一,Hello world!

Nhibernate支持多种类型数据库,包括:FireBird、MSSQL、MySql、Oracle、PostgreSQL、SQLite、SybaseASE、SybaseSQLAnywhere。...2、新建项目并添加引用,将NHibernate-3.3.0.GA-bin“Iesi.Collections.dll”与“NHibernate”引用到项目中,如图2所示复制Configuration_Templates...文件夹对应数据库配置文件,这里使用MSSQL,所以复制“MSSQL.cfg.xml”,并对NHibernate配置信息适当修改 。...;mapping表示映射NHibernateDemo.WebUI命名空间下所有类型,包含持久化类以及对应映射文件所在应用程序集名称。...帮助类,Isession是NHibernate工作单元,它是一个持久化管理器,我们通过ISession来数据库存取数据。

58120
领券