添加实体类和映射文件

一、 添加实体类(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.xsdnhibernate-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安装下面的库

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注