Nhibernate一对多映射——单向关联

本文介绍了Nhibernate中的一对多映射,特别是单向关联的实现方式。通过字典类型和字典表的关系作为示例,展示了如何在映射文件中配置单向一对多关联,使得在查询字典类型时,可以自动获取到相关字典表的所有记录,从而避免了联表查询。同时提到了Nhibernate的懒加载特性,当设置lazy="true"时,可以提升查询效率。
摘要由CSDN通过智能技术生成

在Nhibernate中,映射文件对应数据库表中的关系,所有Nhibernate中也有一对一映射、一对多映射和多对多映射。首先,看看一对多映射,一对多映射就是数据库中两表的关系是一对多的关系,例如:学生和班级的关系,就是一对多的关系,一个班级有多个学生,一个学生只属于一个班级;字典类型和字典表也是一对多的关系。用字典类型和字典表做实例:

一对多关联映射有单向和双向之分,单向表示在一边维护他们的关系,双向表示在两边都要维护关系。首先看下单向一对多关联映射。

字典类型DictionTypeEntity实体和字典实体DictionEntity:

public class DictionaryEntity
	{
        /// <summary>
        /// ID
        /// </summary>
        public virtual Guid ID { get; set; }
        /// <summary>
        /// 键
        /// </summary>
        public virtual string Key { get; set; }
        /// <summary>
        /// 键值
        /// </summary>
		public virtual string Value { get; set; }
        /// <summary>
        /// 类型
        /// </summary>
		public virtual string Type { get; set; }
        /// <summary>
        /// 时间戳
        /// </summary>
        public virtual string TimeStamp { get; set; }
        /// <summary>
        /// 操作用户
        /// </summary>
		public virtual string AddUser { get; set; }
        /// <summary>
        /// 备注,描述
        /// </summary>
        public virtual string Remark { get; set; }
	/// <summary>
        /// 字典类型实体 
        /// </summary>
        public virtual DictionaryTypeEntity DictionaryType { get; set; }
        	
	}
<span style="white-space:pre">	</span>/// <summary>
    <span style="white-space:pre">	</span>///  该实体类与数据库表'T_DictionaryManage'.
	/// </summary>
	public class DictionaryTypeEntity
	{
		#region 实体属性
        /// <summary>
        /// 类型
        /// </summary>
        public virtual string Type { get;set; }
        /// <summary>
        /// 类型名称
        /// </summary>
		public virtual string TypeName  { get; set; }
        /// <summary>
        /// 时间戳
        /// </summary>
		public virtual string TimeStamp	{ get;set; }
        /// <summary>
        /// 操作用户
        /// </summary>
		public virtual string AddUser{ get; set; }
		

		#endregion

        
	}


 

 

字典类型DictionTypeEntity对应的hbm.xml文件:

<pre name="code" class="html"><?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
	<class name="Model.Entity.DictionaryTypeEntity, Model" table="T_DictionaryManage">
		<id name="DictionaryType" type="String" unsaved-value="null">
			<column name="DictionaryType" length="20"    unique="true"/>
			<generator class="assigned" />
		</id>
		<property name="TypeName" type="String">
			<column name="TypeName" length="50"   not-null="true"/>
		</property>
		<property name="TimeStamp" type="String">
			<column name="DateTimeStamp" length="20"   not-null="true"/>
		</property>
		<property name="AddUser" type="String">
			<column name="AddUser" length="20"   not-null="false"/>
		</property>
    
	</class>
</hibernate-mapping>


 

字典实体DictionEntity对应的hbm.xml文件:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="Model.Entity.DictionaryEntity, Model" table="T_Dictionary">
    <cache usage="read-write"/>
<id name="ID" type="Guid" >
<column name="ID" length="150"  index="PK_Dictionary"/>
<generator class="guid" />
</id>
<property name="Key" type="String">
<column name="KeyName" length="20"   not-null="false"/>
</property>
<property name="Value" type="String">
<column name="ValueName" length="20"   not-null="false"/>
</property>
<property name="Type" type="String">
<column name="DictionaryType" length="20"   not-null="false"/>
</property>
    
   <many-to-one name="Type"   class="Model.Entity.DictionaryTypeEntity" column="DictionaryType" />
<property name="TimeStamp" type="String" length="20">
<column name="DateTimeStamp"   not-null="false"/>
</property>
<property name="AddUser" type="String">
<column name="AddUser" length="20"   not-null="false"/>
</property>
<property name="Remark" type="String">
<column name="Remark" length="50"   not-null="false"/>
</property>
</class>
</hibernate-mapping>



这样查询一个字典类型时,字典表里该类型的所有记录也会查询出来,这样显见的是不用两个表联合查询了。

Nhibernate里支持懒加载,如果我们设置lazy="true",则字典表里对应的记录一开始不会查询出来,只有真正使用的时候才会查出来,这样就可以提高一些效率。

评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值