惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
Microsoft Security Blog
Microsoft Security Blog
Recent Announcements
Recent Announcements
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Last Week in AI
Last Week in AI
罗磊的独立博客
腾讯CDC
云风的 BLOG
云风的 BLOG
月光博客
月光博客
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 三生石上(FineUI控件)
宝玉的分享
宝玉的分享
U
Unit 42
I
InfoQ
D
DataBreaches.Net
Blog — PlanetScale
Blog — PlanetScale
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
V
V2EX
美团技术团队
IT之家
IT之家
Stack Overflow Blog
Stack Overflow Blog
F
Fortinet All Blogs
GbyAI
GbyAI
S
SegmentFault 最新的问题

博客园 - nerozhang

NHibernate小结(一) 数据库字符串处理 数据库中的字符串操作 通过查询语句链接到远程数据库 得到数据库表的结构 从两张表中取出不一致的数据 唐诗赏析--唐诗的起源,发展 PetShop 4.0的缓存处理 AggregateCacheDependency、CacheDependency、SqlCacheDependency Asp.net 2.0和PetShop4 的缓存示例 自定义 HttpModule 示例 在global.asax中实现URL重写(应用) Community Starter Kit - 结构 Community Starter Kit - 功能介绍 Community Starter Kit -简介 Petshop 4.0学习-MasterPage.master文件 PetShop 4.0学习-数据访问层之数据库访问设计 PetShop 4.0学习--登录以及注册功能的分析 PetShop 4.0学习--体系架构 PetShop 4.0学习--业务功能介绍
NHibernate Quick Start Guide
nerozhang · 2008-02-15 · via 博客园 - nerozhang

1 实体类:

Code

注意点:在属性之前要加上virtual关键字,否则运行时会报错。

2 map文件:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  
<class name="NHibernate.Examples.QuickStart.User, NHibernate.Examples.QuickStart" table="users">
    
<id name="Id" column="LogonId" type="String" length="20">
      
<generator class="assigned" />
    
</id>
    
<property name="UserName" column="Name" type="String" length="40"/>
    
<property name="Password" type="String" length="20"/>
    
<property name="EmailAddress" type="String" length="40"/>
    
<property name="LastLogon" type="DateTime"/>
  
</class>
</hibernate-mapping>

注意点:如果对应的是.net framework2.0的版本,则

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">2.2

其次是class name一定要写对。前面是要映射类的全称,后面是namespase,也就是Assembly的名称。

还有在生成操作中一定要选:嵌入的资源。

1class: name属性指示了Post实体类的类名和所在的Assebmly的名称,NH将通过反射的方式找到所指示的实体类,关于.Net的反射的说明,请参考MSDN; table属性指示了该实体所对应的数据表的表名

2property: 指示实体属性和数据列的如何映射。name为实体的属性名称,实体的该属性可以为public/private/protected,甚至是 internalcolumn指示了该属性对应的数据列,若实体属性名称和数据列名称相同(忽视大小写),可以省略;type指示了实体属性的.Net 数据类型,可以省略,NH可以自动转换;length只是对string类型的属性适用,指示了字符串的最大长度。

3id: 指示主键。NH支持自动生成主键、数据库生成主键和手工赋值三种方式,我们这里手工赋值的方式,设定generatorclass="assigned"

3 hibernate.cfg.xml—配置文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  
<configSections>
    
<section
      
name="nhibernate" 
      type
="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
    
/>
  
</configSections>

  
<nhibernate>
    
<add 
      
key="hibernate.connection.provider"
      value
="NHibernate.Connection.DriverConnectionProvider"
    
/>
    
<add
      
key="hibernate.dialect"
      value
="NHibernate.Dialect.MsSql2000Dialect"
    
/>
    
<add
      
key="hibernate.connection.driver_class"
      value
="NHibernate.Driver.SqlClientDriver"
    
/>
    
<add
      
key="hibernate.connection.connection_string"
      value
="Server=192.168.0.11;database=NHibernate;uid=sa;pwd=davey@citiz.net;"
    
/>
  
</nhibernate>
</configuration>

注意:hibernate.connection.connection_string是数据库的连接字符串。

4 测试类:

using NHibernate;

using NHibernate.Cfg;

这两个是必须的。

        [SetUp]
        
public void BuildNHibernate()
        
{
            cfg 
= new Configuration();
            cfg.AddAssembly(
"NHibernate.Examples.QuickStart");
            factory 
= cfg.BuildSessionFactory();
            session 
= factory.OpenSession();

        }


在使用NHibernate进行数据库操作时需要以上这些东西。

3 Insert

Code

4 update:

Code

5 select

根据主键查询

IList<User> userList = session.CreateCriteria(typeof(User)).List<User>();

有条件的查询

IList<User> recentUsers = session.CreateCriteria(typeof(User))
              .Add(Expression.Expression.Eq(
"UserName""Joseph Cool"))
                .List
<User>();

利用Hql语言查询

string hql = "  from User u where u.UserName = :Name ";
            IQuery query 
= session.CreateQuery(hql);
            query.SetString(
"Name","Joseph Cool");
            IList
<User> recentUsers = query.List<User>();

6 一对多,多对多关系的查询

实体类:

Category

Code


Item

Code

Category中包含类Item,是一对多的关系。

映射文件:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  
<class name="NHibernate.Examples.OneToMany.Category, NHibernate.Examples.OneToMany" table="nh_categories">
    
<id name="CategoryID" column="CategoryID" type="Guid" 
      unsaved-value
="00000000-0000-0000-0000-000000000000">
      
<generator class="guid" />
    
</id>
    
<property name="Name" type="string" length="50" />
    
<bag name="Items" lazy="true" inverse="true" cascade= "all-delete-orphan">
    
<key column="CategoryID" />
    
<one-to-many class="NHibernate.Examples.OneToMany.Item, NHibernate.Examples.OneToMany" />
    
</bag>
  
</class>
  
<class name="NHibernate.Examples.OneToMany.Item, NHibernate.Examples.OneToMany" table="nh_items">
    
<id name="ItemID" column="ItemID" type="Guid" 
      unsaved-value
="00000000-0000-0000-0000-000000000000">
      
<generator class="guid" />
    
</id>
    
<property name="Name" type="string" length="50" />
    
<many-to-one name="Category" class="NHibernate.Examples.OneToMany.Category, NHibernate.Examples.OneToMany" 
    column
="CategoryID" />
  
</class>
</hibernate-mapping>

其中在Category中指定了一对多的关系:

    <bag name="Items" lazy="true" inverse="true" cascade= "all-delete-orphan">
    
<key column="CategoryID" />
    
<one-to-many class="NHibernate.Examples.OneToMany.Item, NHibernate.Examples.OneToMany" />
</bag>

且指定了级联关系。
在类Item中指定了多对一的关系:

<many-to-one name="Category" class="NHibernate.Examples.OneToMany.Category, NHibernate.Examples.OneToMany" column="CategoryID" />

测试方法1(插入):

Code

测试方法2(级联删除):

Code