咱就入个门之NHibernate映射文件配置(一)

之前写了数据库连接配置,这次说说映射文件的配置,即表映射【ORM的核心就是此啦!】。

下面我们使用最原始的手动配置hbm.xml文件。

步骤:

1、添加People类

namespace NHibernateStudy
{
    public class People
    {
        /// <summary>
        /// 主键
        /// </summary>
        public virtual String Id { get; set; }

        /// <summary>
        /// 姓名
        /// </summary>
        public virtual string Name { get; set; }

        /// <summary>
        /// 性别
        /// </summary>
        public virtual bool Sex { get; set; }

        /// <summary>
        /// 年龄
        /// </summary>
        public virtual Int32 Age { get; set; }

        public virtual string FirstName { get; set; }
        public virtual string LastName { get; set; }
        public virtual string FullName { get; set; }
        public virtual string TempFullName { get; set; }
    }
}

2、添加People.hbm.xml文件【注意哦:生成操作要改为“嵌入的资源”——右击文件,选择属性】

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernateStudy" namespace="NHibernateStudy">
  <class name="People" table="peoples">
    <id name="Id" column="id" type="String">
      <generator class="uuid.hex" />
    </id>
    <property name="Name" column="name" type="String" />
    <property name="Sex" column="sex" type="Boolean" />
    <property name="Age" column="age" type="Int32" />

    <property name="FirstName" column="firstname" type="String" />
    <property name="LastName" column="lastname" type="String" />
    <property name="FullName" formula="firstname||lastname" type="String" />
    <property name="TempFullName" formula="(select A.firstname||A.lastname fro m peoples as A where A.id=id)" type="String" />
  </class>
</hibernate-mapping>

3、hibenate.cfg.xml中添加映射文件配置【添加到session-factory节点内】

<mapping resource="NHibernateStudy.People.hbm.xml" assembly="NHibernateStudy" />

4、可以操作People添加数据啦!

ISessionFactory sessionFactory = (new Configuration()).Configure().BuildSessionFactory();
ISession session = sessionFactory.OpenSession();

#region 添加一条数据
session.Delete("fro m People;");
session.BeginTransaction().Commit();

People p = new People();
p.Name = "addp" + DateTime.Now.ToString("MMddHHmmss");
p.Sex = false;
p.Age = 25;
p.FirstName = "first" + DateTime.Now.ToString("MMddH");
p.LastName = "last" + DateTime.Now.ToString("Hmmss");
session.Save(p);
session.BeginTransaction().Commit();
session.Evict(p);
#endregion

#region 显示数据库数据
//session.Clear();
IList<People> ps = session.CreateCriteria<People>().List<People>();
foreach (var item in ps)
{
                
    Console.WriteLine("ID:" + item.Id + "   Name:" + item.Name + "  Sex:" + item.Sex + "  Age:" + item.Age);
    Console.WriteLine("FirstName:" + item.FirstName + "    FullName:" + item.FullName + " TempFullName:" + item.TempFullName);
}
#endregion

上述代码中有两个额外的要点,下面理一下

第一个是自动生成id的策略,第二个是formula的使用

1、官方提供了许多常用的ID生成策略,基本足够用了,当然也可以自己实现。【注:个人常用的应该是uuid.hex了,主要是使用guid的字符串】

详见官方文档:查看;此处仅接受个人常用

identity 数据库生成int型主键
uuid.hex System.Guid使用ToString()生成Guid
guid.comb Guid类型标识符

其中uuid映射为字符串类型,guid映射为Guid类型。

2、关于formula的使用,主要用于一个字段不是直接来自于数据库,是通过计算或多表筛选得出的。上文中就使用firstname和lastname拼接fullname【sqlite中字符串拼接用‘||’】。

其中需要注意的:新增数据,保存后立即查询,formula不生效,需要执行session.clear()清空缓存以使生效,或者使用session.Evict(x)将之前加的数据从缓存中移除,如此,formula才能正确执行。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*