我碰到、想到和回答过的NHibernate里的不能单独成文的小知识点,持续更新。
Q:不设置Cache时NHibernate会使用二级缓存吗
A:会,它会使用NHibernate.Cache.HashtableCacheProvider
Q:配置文件中use_outer_join和max_fetch_depth有什么作用
A:当使用关联影射时,如果未设置延迟加载,如果use_outer_join为true,则NHibernate用带join的Sql同时读取对象;为false,则分两条Sql读取。
max_fetch_depth表示最多join几个对象。
Q:查询时如何分页
A:使用ICriteria时
ISession session=factory.OpenSession();
ICriteria criteria=session.CreateCriteria(typeof(News));
criteria.SetFirstResult(fromResult);
criteria.SetMaxResults(count);
return criteria.List();
使用IQuery时
IQuery query = Session.CreateQuery(hql);
query.SetFirstResult(fromResult);
query.SetMaxResults(count);
return query.List();
SetFirstResult设置从那天记录开始,SetMaxResults设置取几条数据
Q:Sql2005有dialect吗
A:有,NHibernate论坛可以找到,单独的文件,以后版本可能会加入NHibernate内部。

MsSql2005Dialect.
using System.Text;
using NHibernate.SqlCommand;

namespace NHibernate.Dialect


{
public class MsSql2005Dialect : MsSql2000Dialect

{
public override SqlString GetLimitString(SqlString querySqlString, int offset, int last)

{

/**//*
* WITH query AS
* (SELECT TOP last ROW_NUMBER() OVER (ORDER BY orderby) as __hibernate_row_nr__,
original_query)
* SELECT *
* FROM query
* WHERE __hibernate_row_nr__ > offset
* ORDER BY __hibernate_row_nr__
*/
SqlStringBuilder pagingBuilder = new SqlStringBuilder();
StringBuilder orderByStringBuilder = new StringBuilder();
string distinctStr = string.Empty;

foreach (object sqlPart in querySqlString.SqlParts)

{
string sqlPartString = sqlPart as string;
if (sqlPartString != null)

{
string loweredString = sqlPartString.ToLower();
int orderByIndex = loweredString.IndexOf("order by");
if (orderByIndex != -1)

{
// if we find a new "order by" then we need to ignore
// the previous one since it was probably used for a subquery
orderByStringBuilder = new StringBuilder();
orderByStringBuilder.Append(sqlPartString.Substring(orderByIndex));
}
if (loweredString.TrimStart().StartsWith("select"))

{
int index = 6;
if (loweredString.StartsWith("select distinct"))

{
distinctStr = "DISTINCT ";
index = 15;
}
sqlPartString = sqlPartString.Substring(index);
}

pagingBuilder.Add(sqlPartString);
}
else

{
pagingBuilder.AddObject(sqlPart);
}
}

string orderby = orderByStringBuilder.ToString();
// if no ORDER BY is specified use fake ORDER BY field to avoid errors
if (orderby == null || orderby.Length == 0)
orderby = "ORDER BY CURRENT_TIMESTAMP";

string beginning =
string.Format("WITH query AS (SELECT {0}TOP {1} ROW_NUMBER() OVER ({2}) as __hibernate_row_nr__, ",
distinctStr, last, orderby);
string ending =
string.Format(") SELECT * FROM query WHERE __hibernate_row_nr__ > {0} ORDER BY __hibernate_row_nr__",
offset);

pagingBuilder.Insert(0, beginning);
pagingBuilder.Add(ending);

return pagingBuilder.ToSqlString();
}

public override bool SupportsLimit

{

get
{ return true; }
}

public override bool SupportsLimitOffset

{

get
{ return true; }
}
}
}
Q:Access有dialect吗
A:NHibernateContrib里面有NHibernate.JetDriver.JetDialect
Q:Guid的unsaved-value怎么设置
A:unsaved-value="00000000-0000-0000-0000-000000000000"
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?