之前写了数据库连接配置,这次说说映射文件的配置,即表映射【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 from 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("from 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才能正确执行。