一、 添加实体类(Models)
- 目录规范:项目下新建
Models文件夹,存放与数据库表对应的类。 - Virtual 关键字:所有属性必须设为
virtual,否则 NHibernate 在启用延迟加载(代理对象)时会报错InvalidProxyTypeException。 - News 实体:教程给出了
News类(ID, Title, Content, AddTime, Status)。 - 补充 Keys 实体:基于前一轮的
Keys表,需同步创建关键字实体,为后续多对多映射做准备。
二、 编写映射文件(Mappings)
- 目录规范:新建
Mappings文件夹,存放.hbm.xml文件。 - 命名规范:如
News.cs对应News.hbm.xml。 - XSD 智能提示:将 NuGet 下载的
configuration.xsd和nhibernate-mapping.xsd(位于项目packages\NHibernate.5.1.3下)复制到 VS2015 的Xml\Schemas目录,即可获得 XML 编写提示。 - 文件属性:映射文件需设置为嵌入的资源(生成操作 -> 嵌入的资源),NHibernate 才能读取。
- 多对多补充:教程仅展示了
News的基础字段映射,实际还需在映射中配置与Keys的多对多关系(通过NewsKeys中间表)。
找到 configuration.xsd 和 nhibernate-mappi
ng.xsd 两个文件并复制D:\Program Files (x86)\Microsoft Visual Studio 14.0\Xml\Schemas 目录即可。
红色的是你的vs的安装目录 你可以右击VS图标 然后打开所在位置

三、 完整代码参考
1. Models/News.cs
namespace NHibernateDemo.Models
{
public class News
{
public virtual int ID { set; get; }
public virtual string Title { set; get; }
public virtual string Content { set; get; }
public virtual DateTime AddTime { set; get; }
public virtual bool Status { set; get; }
// 补充:多对多关系,一个新闻对应多个关键字
public virtual ISet<Keys> KeySet { set; get; } = new HashSet<Keys>();
}
}Code language: JavaScript (javascript)
2. Models/Keys.cs
namespace NHibernateDemo.Models
{
public class Keys
{
public virtual int ID { set; get; }
public virtual string Name { set; get; }
public virtual DateTime AddTime { set; get; }
// 补充:多对多关系,一个关键字对应多条新闻
public virtual ISet<News> NewsSet { set; get; } = new HashSet<News>();
}
}Code language: JavaScript (javascript)
3. Mappings/News.hbm.xml
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="NHibernateDemo" namespace="NHibernateDemo.Models">
<class name="NHibernateDemo.Models.News, NHibernateDemo" table="News">
<!-- 主键 -->
<id name="ID" column="ID" type="Int32" unsaved-value="0">
<generator class="native"></generator>
</id>
<!-- 基础字段 -->
<property name="Title" column="Title" type="string" length="150" not-null="true"/>
<property name="Content" column="Content" type="string" not-null="true"/>
<property name="AddTime" column="AddTime" type="DateTime" not-null="true"/>
<property name="Status" column="Status" type="bool" not-null="true"/>
<!-- 补充:多对多映射(关联 Keys,通过中间表 NewsKeys) -->
<set name="KeySet" table="NewsKeys">
<key column="NewsID"/>
<many-to-many class="NHibernateDemo.Models.Keys, NHibernateDemo" column="KeysID"/>
</set>
</class>
</hibernate-mapping>Code language: HTML, XML (xml)
4. Mappings/Keys.hbm.xml
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="NHibernateDemo" namespace="NHibernateDemo.Models">
<class name="NHibernateDemo.Models.Keys, NHibernateDemo" table="Keys">
<id name="ID" column="ID" type="Int32" unsaved-value="0">
<generator class="native"></generator>
</id>
<property name="Name" column="Name" type="string" length="50" not-null="true"/>
<property name="AddTime" column="AddTime" type="DateTime" not-null="true"/>
<!-- 反向多对多 -->
<set name="NewsSet" table="NewsKeys" inverse="true">
<key column="KeysID"/>
<many-to-many class="NHibernateDemo.Models.News, NHibernateDemo" column="NewsID"/>
</set>
</class>
</hibernate-mapping>Code language: HTML, XML (xml)
NHibernate 要知道怎样去加载和存储持久化类的对象。这正是 NHibernate 映射文件发挥作用的地方。
把xml文件修改为嵌入的资源

映射文件包含了对象/关系映射所需的元数据。 元数据包含持久化类的声明和属性到数据库的映射。映射文件告诉 NHibernate 它应该访问数据库里面的哪个表及使用表里面的哪些字段。
Nuget安装下面的库


Previous: 创建控制台项目并通过NuGet安装NHibernate环境
Next: 了解Nhibernate的Session