NHibernate的联合主键配置比较复杂,初次配置可能需要花些时间,但只要我们理解了,掌握一定的步骤还是很容易的。
1、设计数据结构
Users:用户表
名称 | Users | ||||
说明 | 用户表 | ||||
序号 | 字段名称 | 数据类型(长度) | 允许空 | 描述 | 备注说明 |
1 | USER_ID | VARCHAR(32) | 用户ID | PK | |
2 | USER_NAME | VARCHAR(50) | 用户名 | ||
3 | PASSWORD | VARCHAR(32) | 密码 | ||
4 | |||||
5 | |||||
主键 | USER_ID |
UserProfiles:用户Profile表
名称 | UserProfiles | ||||
说明 | 用户Profile表 | ||||
序号 | 字段名称 | 数据类型(长度) | 允许空 | 描述 | 备注说明 |
1 | USER_ID | VARCHAR(32) | 用户ID | PK | |
2 | PROFILE_KEY | VARCHAR(50) | Key键值 | ||
3 | PROFILE_VALUE | VARCHAR(10) | Value值 | ||
4 | |||||
5 | |||||
主键 | USER_ID,PROFILE_KEY |
2、设计持久化类
UserInfo.cs
代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace LXJ.NHibernate.Demo.Model.Auth { public class UserInfo { public virtual string USER_ID { get; set; } public virtual string USER_NAME { get; set; } public virtual string PASSWORD { get; set; } //注意此处:表明UserInfo与UserProfileInfo为 1:n public virtual IList<UserProfileInfo> UserProfiles { get; set; } }// }//
UserProfileInfo.cs
代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace LXJ.NHibernate.Demo.Model.Auth { public class UserProfileInfo { //把组合主键(USER_ID,PROFILE_KEY)抽象成一个类UserProfilePKInfo public virtual UserProfilePKInfo UserProfilePK { get; set; } public virtual string PROFILE_VALUE { get; set; } } }
UserProfilePKInfo.cs
代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace LXJ.NHibernate.Demo.Model.Auth { public class UserProfilePKInfo { public virtual string USER_ID { get; set; } public virtual string PROFILE_KEY { get; set; } /// <summary> /// 判断两个对象是否相同,这个方法需要重写 /// </summary> /// <param name="obj">进行比较的对象</param> /// <returns>真true或假false</returns> public override bool Equals(object obj) { if (obj is UserProfilePKInfo) { UserProfilePKInfo pk = obj as UserProfilePKInfo; if (this.USER_ID == pk.USER_ID && this.PROFILE_KEY == pk.PROFILE_KEY) { return true; } else { return false; } } return false; } public override int GetHashCode() { return base.GetHashCode(); } } }
注意:UserProfilePKInfo类必须对Equals和GetHashCode方法进行重写。
3、配置映射文件
UserInfo.hbm.xml
代码
<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="LXJ.NHibernate.Demo.Model" namespace="LXJ.NHibernate.Demo.Model.Auth"> <class name="LXJ.NHibernate.Demo.Model.Auth.UserInfo, LXJ.NHibernate.Demo.Model" table="Users"> <id name="USER_ID" column="USER_ID" type="String" length="32"> <generator class="assigned" /> </id> <property name="USER_NAME" column="USER_NAME" type="String" length="50" not-null ="true"/> <property name="PASSWORD" column="PASSWORD" type="String" length="32" not-null ="true"/> <bag name="UserProfiles" inverse="true" lazy="true" cascade="all-delete-orphan"> <key column="USER_ID"/> <one-to-many class="LXJ.NHibernate.Demo.Model.Auth.UserProfileInfo, LXJ.NHibernate.Demo.Model"/> </bag> </class> </hibernate-mapping>
其中<bag>....</bag>节是配置Users与UserProfiles的一对多映射关系,UserProfiles为类UserInfo中的属性
UserProfileInfo.hbm.xml
代码
<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="LXJ.NHibernate.Demo.Model" namespace="LXJ.NHibernate.Demo.Model.Auth"> <class name="LXJ.NHibernate.Demo.Model.Auth.UserProfileInfo, LXJ.NHibernate.Demo.Model" table="UserProfiles"> <composite-id name="UserProfilePK" class="LXJ.NHibernate.Demo.Model.Auth.UserProfilePKInfo, LXJ.NHibernate.Demo.Model"> <key-property name="USER_ID" column="USER_ID" type="String" length="32" /> <key-property name="PROFILE_KEY" column="PROFILE_KEY" type="String" length="50" /> </composite-id> <property name="PROFILE_VALUE" column="PROFILE_VALUE" type="String" length="100" not-null ="true"/> </class> </hibernate-mapping>
注意:
- <composite-id> .... </composite-id>配置节依赖于类UserProfilePKInfo
- composite-id name="UserProfilePK" 注意此处的名称