1、实体bool类型属性与数据库映射。如实体中有bool属性IsDelete.配置如下

<property column="IsDelete" name="IsDelete" type="YesNo" ></property>

或者

<property name="Deleted" type="NHibernate.Type.YesNoType,NHibernate">
  <column name="Deleted" sql-type="char(1)" default="0" not-null="true"></column>
</property>

2、若将数据写入到表时,希望某个字段不被写入则如下映射

<property column="IsDelete" name="IsDelete" insert="false"></property>

3、两个对象之间多对多时,生成两个表之间的映射关系表.如一下生成 人员与公司之间的映射关系表UserCompanyMap.UserID与CompanyID作为联合主键

<set name="Companies" table="UserCompanyMap" >
  <key column="UserID" />
  <many-to-many column="CompanyID" class="Domain.Company,Domain" />
</set>

4、通过ICritetia接口做关联查询;如有many-to-one关系的Profile和Department。现在希望通过sql直接查询返回dto ProfileDTO 。sql如下;

SELECT p.ItemID, p.Name, p.Summary, d.ItemID, d.Name
FROM Profile p inner join Department d on p.DepartmentID = d.ItemID
 public class ProfileDTO
{
private int _itemID;
private int _departmentID;
private string _departmentName;
private string _name;
private string _summary; public virtual int ItemID
{
get { return _itemID; }
set { _itemID = value; }
} public virtual int DepartmentID
{
get { return _departmentID; }
set { _departmentID = value; }
} public string DepartmentName
{
get { return _departmentName; }
set { _departmentName = value; }
} public string Name
{
get { return _name; }
set { _name = value; }
} public string Summary
{
get { return _summary; }
set { _summary = value; }
}
}
    public static IList List()
{
ICriteria criteriaSelect = Persistence.Session.CreateCriteria(typeof(Profile)); criteriaSelect.CreateAlias("Department", "d"); criteriaSelect.SetProjection(
Projections.ProjectionList()
.Add(Projections.Property("ItemID"), "ItemID")
.Add(Projections.Property("Name"), "Name")
.Add(Projections.Property("Summary"), "Summary")
.Add(Projections.Property("d.ItemID"), "DepartmentID")
.Add(Projections.Property("d.Name"), "DepartmentName")); criteriaSelect.AddOrder(Order.Asc("Name"));
criteriaSelect.SetResultTransformer(NHibernate.Transform.Transformers.AliasToBean(typeof(ProfileDTO)));
return criteriaSelect.List();
}

5、ICriteia 接口进行数据分页查询时,一般情况下,可能如下使用:           

            
            ICriteria criteria = session.CreateCriteria(typeof(T));
            foreach (ICriterion cri in queryConditions)
{
criteria.Add(cri);
}
ICriteria criteriaRowCount = CriteriaTransformer.Clone(criteria);
recordCount = criteriaRowCount.SetProjection(Projections.RowCount())
.UniqueResult<int>();
foreach (ICriterion cri in queryConditions)
{
detachedCriteria.Add(cri);
}

            if (IsPage)
            {
              int skipCount=(pageIndex - 1)*pageSize;
              criteria.SetFirstResult(skipCount).SetMaxResults(*pageSize);
            }

            criteria.SetResultTransformer(new DistinctRootEntityResultTransformer());

return criteria.List<T>();

但是这样可能会导致数据分页出现问题。如果实体T没有和其他表的关联关系,这样取数据显然是可行的。但是如果关联过多,而T又不是领域里的聚合根,则可能导致分页问题。

原因是NHibernate使用left join 关联多表进行查询时,查询出满足条件的数据,然后按照SetFirstResult(skipCount).SetMaxResults(*pageSize)进行获取,然后去重,再显

示,这样在过滤掉重复数据后,返回的数据就会比pageSize少。如果pageSize比NHibernate进行left join 后的结果还多的话,那就没有问题。但是一旦pageSize少于left join的

记录数,则分页还存在问题.

解决办法:

          ICriteria criteria = session.CreateCriteria(typeof(T));
foreach (ICriterion cri in queryConditions)
{
criteria.Add(cri);
}
ICriteria criteriaRowCount = CriteriaTransformer.Clone(criteria);
recordCount = criteriaRowCount.SetProjection(Projections.RowCount())
.UniqueResult<int>();
int skipCount = (pageIndex - )*pageSize;
criteria.AddOrder(new Order(orderField, isAscending));
DetachedCriteria detachedCriteria = DetachedCriteria.For<T>();
detachedCriteria.SetProjection(Projections.Distinct(Projections.Id()));
foreach (ICriterion cri in queryConditions)
{
detachedCriteria.Add(cri);
}
List<object> list;
            if (IsPage)list = detachedCriteria.GetExecutableCriteria(session).SetFirstResult(skipCount).SetMaxResults(pageSize).List<object>().ToList();
            else list = detachedCriteria.GetExecutableCriteria(session).List<object>().ToList();
            criteria.Add(Restrictions.In(GetIndentity<T>(), list));//GetIndentity<T>() 获取实体标识名,即对应数据库主键的实体属性名称
           criteria.SetResultTransformer(new DistinctRootEntityResultTransformer()); 

                   return criteria.List<T>();

6、持久化枚举类型

<property name="HouseType">
  <column name="HouseType" sql-type="varchar(10)" default="0" not-null="true"></column>
</property>

7、Hql查询直接返回对象

const string hql = @"SELECT new KeyValuePair(COUNT(log.Point)
,user.DepartmentName)
FROM Log log ,User user
WHERE log.UserGuid=user.UserGuid
GROUP BY user.DepartName";
IQuery query = session.CreateQuery(hql);
return query.List<KeyValuePair>();

同时需要给KeyValuePair定义映射,(不需要映射到表)如:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="" namespace="">
<import class="" />
</hibernate-mapping>

8、NHibernate的日志不影响你使用Log4Net写日志

<?xml version="1.0" encoding="utf-8" ?>
<log4net> <root>
<!--如果只需要看看Sql设置INFO就够了,如果你要调试可以设置为DEBUG或ALL-->
<priority value="INFO" />
<appender-ref ref="rollingFile" />
</root> <logger name="myLog">
<level value="INFO" />
<appender-ref ref="rollingFile1" />
</logger> <appender name="rollingFile" type="log4net.Appender.RollingFileAppender,log4net" > <param name="File" value="log.txt" />
<param name="AppendToFile" value="false" />
<param name="RollingStyle" value="Date" />
<param name="DatePattern" value="yyyy.MM.dd" />
<param name="StaticLogFileName" value="true" /> <layout type="log4net.Layout.PatternLayout,log4net">
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] &lt;%X{auth}&gt; - %m%n" />
</layout>
</appender> <appender name="rollingFile1" type="log4net.Appender.RollingFileAppender,log4net" > <param name="File" value="log1.txt" />
<param name="AppendToFile" value="false" />
<param name="RollingStyle" value="Date" />
<param name="DatePattern" value="yyyy.MM.dd" />
<param name="StaticLogFileName" value="true" /> <layout type="log4net.Layout.PatternLayout,log4net">
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] &lt;%X{auth}&gt; - %m%n" />
</layout>
</appender> </log4net>

使用Log4Net

ILog Log= LogManager.GetLogger("myLog"); 
Log.Info("记录日志");

9、配置C# Decimal类型

<column name="totalPrice" precision="22" scale="0" />

10、配置属性说明:

1)<property>元素 insert属性:设置为false,在insert语句中不包含这个字段,表示永远不会被插入,默认true
      2)<property>元素 update属性:设置为false,在update语句中不包含这个字段,表示永远不会被修改,默认true
      3)<class>元素 mutable属性:设置为false就是把所有的<property>元素的update属性设置为了false,说明这个对象不会被更新,默认true
      4)<property>元素 dynamic-insert属性:设置为true,表示insert对象的时候,生成动态的insert语句,如果这个字段的值是null就不会加入到insert语句当中.默认false
      5)<property>元素 dynamic-update属性,设置为true,表示update对象的时候,生成动态的update语句,如果这个字段的值是null就不会被加入到update语句中,默认false
      6)<class>元素 dynamic-insert属性:设置为true,表示把所有的<property>元素的dynamic-insert属性设置为true,默认false
      7)<class>元素 dynamic-update属性:设置为true,表示把所有的<property>元素的dynamic-update属性设置为true,默认false

 参考:

http://blog.sina.com.cn/s/blog_7ffb8dd501014v2e.html

NHibernate 知识点整理的更多相关文章

  1. ACM个人零散知识点整理

    ACM个人零散知识点整理 杂项: 1.输入输出外挂 //读入优化 int 整数 inline int read(){ int x=0,f=1; char ch=getchar(); while(ch& ...

  2. Android 零散知识点整理

    Android 零散知识点整理 为什么Android的更新试图操作必须在主线程中进行? 这是因为Android系统中的视图组件并不是线程安全的.通常应该让主线程负责创建.显示和更新UI,启动子线程,停 ...

  3. vue前端面试题知识点整理

    vue前端面试题知识点整理 1. 说一下Vue的双向绑定数据的原理 vue 实现数据双向绑定主要是:采用数据劫持结合发布者-订阅者模式的方式,通过 Object.defineProperty() 来劫 ...

  4. kafka知识点整理总结

    kafka知识点整理总结 只不过是敷衍 2017-11-22 21:39:59 kafka知识点整理总结,以备不时之需. 为什么要使用消息系统: 解耦 并行 异步通信:想向队列中放入多少消息就放多少, ...

  5. JSP页面开发知识点整理

    刚学JSP页面开发,把知识点整理一下. ----------------------------------------------------------------------- JSP语法htt ...

  6. JS知识点整理(二)

    前言 这是对平时的一些读书笔记和理解进行整理的第二部分,第一部分请前往:JS知识点整理(一).本文包含一些易混淆.遗漏的知识点,也会配上一些例子,也许不是很完整,也许还会有点杂,但也许会有你需要的,后 ...

  7. css入门知识点整理

    css入门知识点整理 不要嘲笑我这个蒟蒻..例子来源:w3school css其实就分为两个东西,一个是选择器,另外一个是声明.声明定义了某个对象的属性的值,这都是html的内容.重点要关注的是选择器 ...

  8. activity生命周期知识点整理

    activity生命周期知识点整理 Activity: 是一个应用组件,用户可与其提供的屏幕进行交互.窗口通常会充满屏幕,但也可以小于屏幕并浮动在其他窗口之上. 一个activity的什么周期: 启动 ...

  9. 【Android 面试基础知识点整理】

    针对Android面试中常见的一些知识点整理,Max 仅仅是个搬运工.感谢本文中引用文章的各位作者,给大家分享了这么多优秀文章.对于当中的解析,是原作者个人见解,有错误和不准确的地方,也请大家积极指正 ...

随机推荐

  1. 用SQL语句将远程SQL Server数据库中表数据导入到本地数据库相应的表中

    一.方法一 访问不同电脑上的数据库(远程访问,只好联好网就一样),如果经常访问或数据量较大,建议用链接服务器方法. 1.创建链接服务器 exec sp_addlinkedserver ‘srv_lnk ...

  2. 8.翻译:EF基础系列----EF中实体的状态

    原文链接:http://www.entityframeworktutorial.net/basics/entity-states.aspx 在实体的生命周期中,EF API维护着每一个实体的状态,对于 ...

  3. 转:zTree树控件扩展篇:巧用zTree控件实现文本框输入关键词自动模糊查找zTree树节点实现模糊匹配下拉选择效果

    是否可以借助于zTree实现文本框输入关键词自动模糊匹配zTree下拉树,然后选择下拉树内节点显示在文本框内且隐藏下拉树. 看到这个需求脑子里头大致已经想到了要如何实现这样一个需求,当时是限于时间问题 ...

  4. django url 中的namespace详解

    [引子] django是一个比较全能的web框架,比如它实现了自己的orm模型来对接不同的数据库.并提供了方便的数据接口:django牛逼的地方 还有许多,如他实现了自己的模板语言,这样我们就能方便的 ...

  5. html与表格(table)相关的属性

    <table> 标签定义 HTML 表格.简单的 HTML 表格由 table 元素以及一个或多个 tr.th 或 td 元素组成.tr 元素定义表格行,th 元素定义表头,td 元素定义 ...

  6. react-native react-navigation使用

    npm install react-navigation --save 安装 代码中引入StackNavigator组件   5CF902D1-9639-494D-8775-A9A87F376734. ...

  7. 本地启动spark-shell

    由于spark-1.3作为一个里程碑式的发布, 加入众多的功能特性,所以,有必要好好的研究一把,spark-1.3需要scala-2.10.x的版本支持,而系统上默认的scala的版本为2.9,需要进 ...

  8. fpm制做mysql-5.6.33 rpm包

    增加用户: # groupadd -r mysql # useradd -g mysql -r -s /sbin/nologin -M -d /data/my_db mysql 源码安装mysql-5 ...

  9. mysql中delimiter

    delimiter xx 其实就是告诉MySQL解释器,该段命令已经结束了,mysql是否可以执行了.默认请况下delimiter是分号';'.

  10. 解决最小化安装Centos7后无法上网的问题,以及安装成功后的基本配置

    发现问题 刚装完最小化的系统后,如果直接ping外网,可能回出现如下情况 解决问题 首先编辑虚拟机的DHCP池: 在弹出的“虚拟网络编辑器”窗口中选择NAT模式的,编辑为其分配地址池: 然后编辑网卡的 ...