注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

ORM的分析之四NHibernate的应用之一基本内容  

2012-08-15 19:04:05|  分类: NET(C#) |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
 

ORM的分析之四NHibernate的应用之一基本内容

 

NHibernate是个好东西,不过他太庞大了,还得学习HQL语言,但是应用在大型项目上后,这个东西还是相当有力量的。今天就讲一下这个东西,学习新东西就意味着开扩了自己的视野,增加了自己的见地,所以还是推荐大家多看多学新的东西。

这里从网上找了一个例程,但是是WEB的,而且使用的DLL版本是相当低的2.1.2,于是从网上下来最新的3.3.1,工程如下:

其实跟前面的MYBATIS一样,主要是XML和实体类以及相应的配置文件,如下:

hibernate.cfg.xml:

<?xml version="1.0" encoding="utf-8" ?>

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

    <session-factory name="NhibernateORM.fmMain">

        <property name="connection.driver_class">

            NHibernate.Driver.SqlClientDriver

        </property>

        <property name="connection.connection_string">

            Data Source=(local);Initial Catalog=MyTest;uid=sa;password=123456;

        </property>

        <property name="adonet.batch_size">10</property>

        <property name="show_sql">true</property>

        <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>

        <!--<property name="use_outer_join">true</property>-->

        <property name="command_timeout">10</property>

        <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>

        <!--<property name='proxyfactory.factory_class'>

            NHibernate.ByteCode.LinFu.ProxyFactoryFactory,NHibernate.ByteCode.LinFu

        </property>-->

        <mapping assembly="ClassNhibernate"/>

    </session-factory>

</hibernate-configuration>

People.hbm.xml:

<?xml version="1.0" encoding="utf-8" ?>

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

    <class name="People, ClassNhibernate" table="people" lazy="false">

        <id name="id" type="int" unsaved-value="null">

            <column name="id" length="4" sql-type="int" not-null="true" unique="true"

                 index="PK__people__7C8480AE"/>

            <generator class="native" />

        </id>

        <property name="name" type="String">

            <column name="name" length="50" sql-type="varchar" not-null="false"/>

        </property>

        <property name="sex" type="String">

            <column name="sex" length="50" sql-type="varchar" not-null="false"/>

        </property>

        <property name="age" type="int">

            <column name="age" length="4" sql-type="int" not-null="false"/>

        </property>

    </class>

</hibernate-mapping>

People.cs:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace ClassNhibernate

{

    [Serializable]

    public class People

    {

        public virtual int id { get; set; }

        public virtual string name { get; set; }

        public virtual string sex { get; set; }

        public int age { get; set; }

    }

}

 

然后,就是操作了,当然前提是得引用两个库:Iesi.Collections.dll,NHibernate.dll,再添加名空间的引用,这里有一个小问题,如果使用老的版本的库,在VS2010里即使引用了上面的库,也无法添加名空间的引用,可能是库注册方式有改变吧。

        private void btnDisplay_Click(object sender, EventArgs e)

        {

            //配?置?文?件t

            Configuration con = new Configuration();

            string[] ss = Assembly.GetEntryAssembly().GetManifestResourceNames();

            //con.AddClass(typeof(NhibernateORM.People));

            con.Configure();

 

            ISessionFactory factory = con.BuildSessionFactory();

            ISession session = factory.OpenSession();

 

            ITransaction tran = session.BeginTransaction();

 

            try

            {

                this.dataGridView1.DataSource = session.CreateQuery("from People").List();

 

                              People pp = new People();

                pp.name = "Stone";

                pp.sex = "男D";

                pp.age = 22;

                session.Save(pp);

                trans.Commit();

                Response.Write("添加成功");

 

            }

            catch (Exception ee)

            {

                string s = ee.Message.ToString();

                tran.Rollback();

            }

            finally

            {

                factory.Close();

                session.Close();

            }

        }

见上面的hibernate.cfg.xml这个文件中的红色高亮部分,这个可坑人了,就是因为这一个配置语句,导致在本程序里编译成功后,运行到:

ISessionFactory factory = con.BuildSessionFactory();

            ISession session = factory.OpenSession();

时程序直接报一个什么“The following types may not be used as proxies,people的XX属性必须为VIRTUAL PUBLIC”什么的。

看起来简单的东西,担误了大约有两天左右的时间。

还是那句话:

看来容易做时难。

努力啊。

  评论这张
 
阅读(1116)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017