上一章节,我们了解了NHibernate的介绍和用途,那NHibernate如何引入到项目中,并且被运用呢,这一章我们开始操作吧!

  注:本材料开始本人研究3天研究出来的,绝对最新,请仔细阅读!!!

  首先要有准备工作:

  1、下载NHibernate:当前版本2.0.1(较新版本)下载地址:http://sourceforge.net/projects/nhibernate/

  2、下载CodeSmith:http://www.codesmithtools.com/
  3、下载NHibernate模板:https://files.cnblogs.com/abluedog/nhibernate_template.rar

  

  关于NHibernate2.1版本的一些说明:

NHibernate2.1版本改变了ByteCode延迟加载机制,有三种3种IoC框架动态代理方式,分别为:Castle框架、LinFu框 架、Spring.Net框架。我们只要选择一种,在配置文件中配置proxyfactory.factory_class节点。

如果使用Castle.DynamicProxy2动态代理,引用NHibernate.ByteCode.Castle.dll程序集并配置 proxyfactory.factory_class节点为<property name="proxyfactory.factory_class"> NHibernate.ByteCode.Castle.ProxyFactoryFactory,NHibernate.ByteCode.Castle</property>

如果使用LinFu.DynamicProxy动态代理,引用NHibernate.ByteCode.LinFu.dll程序集并配置 proxyfactory.factory_class节点为<property name="proxyfactory.factory_class"> NHibernate.ByteCode.LinFu.ProxyFactoryFactory,NHibernate.ByteCode.LinFu</property>

如果使用Spring.Aop动态代理,引用NHibernate.ByteCode.Spring.dll程序集并配置 proxyfactory.factory_class节点为<property name="proxyfactory.factory_class"> NHibernate.ByteCode.Spring.ProxyFactoryFactory,NHibernate.ByteCode.Spring</property>

另外NHibernate2.1要求.NET2.0 SP1以上版本 (System.DateTimeOffset),请使用VS2005的,务必打上Sp1补丁。推荐使用VS2008以上版本。

 

  OK,准备工作结束,开始讲解如何运用这3个工具:

  首先打开CodeSmith(注意CodeSmith一定要注册),导入NHibernate模板:如图

  NHibernate配置的总体流程(转载)

  注意:我在网上搜索很多关于NHibernate模板,始终没有找到,这个模板算是比较好的,但是要修改一下类生成文件和映射生成文件的内容:

  1、打开NHibernate.class.cst,找到如下代码:把所有生成 get、set 的 public 修饰符改为 public virtual ,注绿色virtual为添加部分

  

#region Public Properties

<% if (SourceTable.PrimaryKey.MemberColumns.Count == 1) {%>
public virtual <%= IdMemberType(SourceTable) %> <%= IdName(SourceTable) %>
{
get {return <%= IdMemberName(SourceTable) %>;}
<% if (IdMemberType(SourceTable) == "string" ) {%>
set
{
if ( value != null && value.Length > <%= ColumnLength(SourceTable.PrimaryKey.MemberColumns[0])%>)
throw new ArgumentOutOfRangeException("Invalid value for <%= IdName(SourceTable) %>", value, value.ToString());
<%= IdMemberName(SourceTable) %> = value;
}
<% } else { %>
set {<%= IdMemberName(SourceTable) %> = value;}
<% } %>
}
<% } %>

<% foreach(ColumnSchema column in SourceTable.NonKeyColumns) { %>
public virtual <%= MemberType(column) %> <%= PropertyName(column) %>
{
get { return <%= MemberName(column) %>; }
<% if (MemberType(column) == "string") {%>
set
{
if ( value != null && value.Length > <%= ColumnLength(column)%>)
throw new ArgumentOutOfRangeException("Invalid value for <%= PropertyName(column) %>", value, value.ToString());
<%= MemberName(column) %> = value;
}
<% } else { %>
set { <%= MemberName(column) %> = value; }
<% } %>
}

<% } %>
<% foreach(TableKeySchema foreignKey in SourceTable.ForeignKeys) { %>
public <%= ManyToOneClass(foreignKey) %> <%= ManyToOneName(foreignKey) %>
{
get { return <%= ManyToOneMemberName(foreignKey) %>; }
set { <%= ManyToOneMemberName(foreignKey) %> = value; }
}

<% if ((foreignKey.ForeignKeyTable == SourceTable) && (foreignKey.PrimaryKeyTable == SourceTable)) { %>
public virtual <%= CollectionType(foreignKey) %> <%= CollectionName(foreignKey) %>
{
get { return <%= CollectionMemberName(foreignKey) %>; }
set { <%= CollectionMemberName(foreignKey) %> = value; }
}

<% } %>
<% } %>
<% foreach(TableKeySchema primaryKey in SourceTable.PrimaryKeys) { %>
<% if (IsManyToManyTable(primaryKey.ForeignKeyTable)) { %>
public virtual <%= CollectionType(primaryKey) %> <%= CollectionManyToManyName(primaryKey) %>
{
get
{
if (<%= CollectionManyToManyMemberName(primaryKey) %>==null)
{
<%= CollectionManyToManyMemberName(primaryKey) %> = <%= NewCollectionType(primaryKey) %>;
}
return <%= CollectionManyToManyMemberName(primaryKey) %>;
}
set { <%= CollectionManyToManyMemberName(primaryKey) %> = value; }
}

<% } else if (IsOneToOneTable(primaryKey)) { %>
public virtual <%= OneToOneClass(primaryKey) %> <%= OneToOneName(primaryKey) %>
{
get { return <%= OneToOneMemberName(primaryKey) %>; }
set { <%= OneToOneMemberName(primaryKey) %> = value; }
}

<% } else if (IsSubClassTable(primaryKey)) { %>
<% } else { %>
public virtual <%= CollectionType(primaryKey) %> <%= CollectionName(primaryKey) %>
{
get
{
if (<%= CollectionMemberName(primaryKey) %>==null)
{
<%= CollectionMemberName(primaryKey) %> = <%= NewCollectionType(primaryKey) %>;
}
return <%= CollectionMemberName(primaryKey) %>;
}
set { <%= CollectionMemberName(primaryKey) %> = value; }
}

<% } %>
<% } %>


#endregion

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-09-05
  • 2021-06-18
  • 2022-12-23
  • 2022-12-23
  • 2021-05-17
猜你喜欢
  • 2021-09-10
  • 2021-06-24
  • 2022-12-23
  • 2022-02-23
  • 2021-10-17
  • 2021-10-07
相关资源
相似解决方案