国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

通俗易懂的Nhibernate教程(1)-----基本操作,映射,CURD

2019-11-14 15:51:29
字體:
供稿:網(wǎng)友

網(wǎng)站架構(gòu):

1.圖片

image_thumb3

2.說明

Data  -----------------------   類庫項目,數(shù)據(jù)訪問層,由Nhibernate提供數(shù)據(jù)相關(guān)操作

Mapping -------------------    類庫項目,映射文件都在這個項目中

Model   --------------------    類型項目,實(shí)體層

XShop  --------------------     Mvc項目,UI層

 

步驟:

1.安裝Nhibernate

2.配置Nhibernate

3.創(chuàng)建實(shí)體類

4.編寫映射文件

5.創(chuàng)建數(shù)據(jù)庫/表

6.CURD操作

7.測試

 

 

第一步:安裝Nhibernate,這一步就不用說了,使用Nuget安裝,看圖

 

image_thumb11

 

 

第二步:配置Nhibernate

2.1 這一步主要是一些系統(tǒng)級的配置,如:連接字符串,數(shù)據(jù)庫驅(qū)動,數(shù)據(jù)庫方言等

2.2 創(chuàng)建 hibernate.cfg.xml文件(XShop項目中)

<?xml version="1.0" encoding="utf-8" ?><hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">  <!--Nhibernate對數(shù)據(jù)庫操作是基于Isession(會話),可以理解為SqlConnection的封裝,可通過SessionFactory創(chuàng)建-->  <session-factory name="XShop">    <!--連接提供程序-->    <PRoperty name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>        <!--連接字符串-->    <property name="connection.connection_string">      Server=.;initial catalog=XShopDb;Integrated Security=SSPI    </property>        <!--Nhibernate是一個支持多個數(shù)據(jù)庫的Orm框架,然而幾乎每個數(shù)據(jù)庫產(chǎn)品都對Sql的實(shí)現(xiàn)都有所不同-->    <!--Nhibernate通過dialect(方言)消除數(shù)據(jù)庫之間的差異-->    <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>        <!--是否在調(diào)試的時候打印Sql語句-->    <property name="show_sql">true</property>        <!--映射文件所在的程序集-->    <mapping assembly="Mapping"/>  </session-factory></hibernate-configuration>

溫馨提示:如果發(fā)現(xiàn)在編寫xml文件的時候發(fā)現(xiàn)沒有智能提示,請把Nhibernate包的xsd文件復(fù)制到Vs安裝目錄中(參考百度)

注意:Nhibernate配置文件的文件名必須為 hibernate.cfg.xml ,不可隨意更改

 

第三步:創(chuàng)建實(shí)體類 Customer(Model項目)

3.1 代碼

namespace Model{    public class Customer    {        public virtual int Id { get; set; }        public virtual string Name { get; set; }        public virtual string UserName { get; set; }        public virtual string PassWord { get; set; }        public virtual DateTime CreateTime { get; set; }    }}

注意:實(shí)體類的屬性必須是virtual,否則Nhibernate會報錯.why?因?yàn)檫@樣Nhibernate就可以重寫這些屬性的訪問邏輯,比如 延遲加載..

 

第四步:創(chuàng)建 Customer.hbm.xml 映射文件(Mapping項目)

4.1 代碼:

<?xml version="1.0" encoding="utf-8" ?><hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Model" auto-import="true" default-cascade="all" default-lazy="true" namespace="Model">  <!--<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="實(shí)體類所在的程序集" auto-import="是否自動導(dǎo)入命名空間,如果否,下面類名應(yīng)該寫類的全名"  default-cascade="默認(rèn)的級聯(lián)操作" default-lazy="是否延遲加載" namespace="實(shí)體類所在的命名空間">-->    <!--<class name="類型名/類型全名" table="對應(yīng)的表名" >-->  <class name="Customer" table="Customer" >        <!--id是必須的-->    <!--<id name="Id的屬性名" column="列名" type="數(shù)據(jù)類型" unsaved-value="未被持久化到數(shù)據(jù)庫時,id的值" generator="id的生成策略"></id>-->    <id name="Id" column="CustomerId" type="int" unsaved-value="0" generator="native"></id>        <!--<property name="屬性名" column="對應(yīng)的列名" length="長度" type="數(shù)據(jù)類型" not-null="是否不可空"></property>-->    <property name="Name" column="Name" length="20" type="string" not-null="true"></property>    <property name="UserName">      <column  name="UserName" sql-type="nvarchar" not-null="true" length="20"></column>    </property>        <property name="Password" length="32" column="Password" not-null="true" type="string"></property>    <property name="CreateTime" column="CreateTime" type="datetime" not-null="true"></property>  </class></hibernate-mapping>

注意:

1.映射文件命名規(guī)則:  類名.hbm.xml  ,不可隨意更改

2.映射文件的生成策略必須為:嵌入到程序集

 

第五步:創(chuàng)建數(shù)據(jù)庫和表

5.1 創(chuàng)建數(shù)據(jù)庫

CREATE DATABASE XShopDbGO

 

5.2  創(chuàng)建表

   5.2.1創(chuàng)建表的兩種方式--手動創(chuàng)建

    注意:創(chuàng)建的表結(jié)構(gòu)應(yīng)該與映射文件一樣

    5.2.1創(chuàng)建表的兩種方式--使用SchemaExport生成的Sql

    代碼:可以創(chuàng)建一個控制臺項目或Winform項目跑下面這段代碼

NHibernate.Cfg.Configuration configuration = new NHibernate.Cfg.Configuration().Configure();NHibernate.Tool.hbm2ddl.SchemaExport schemaExport = new NHibernate.Tool.hbm2ddl.SchemaExport(configuration);//打印Sql腳本,但不執(zhí)行 schemaExport.Create(true, false); //導(dǎo)出到文件//schemaExport.SetOutputFile(@"c:/schma.sql");

       結(jié)果:

        image_thumb5

 

 

第六步:CURD操作(Data項目)

6.1 上面我們提過,所有數(shù)據(jù)庫操作都是通過ISession對象操作,而ISession可以通過ISessionFactory創(chuàng)建

-----創(chuàng)建HbmHelper類--獲取ISessionFactory

namespace Data{    public class HbmHelper    {        private static ISessionFactory _sessionFactory;        public static ISessionFactory CurrentSessionFactory        {            get            {                if (_sessionFactory == null)                {                    //創(chuàng)建SessionFactory                    _sessionFactory = new Configuration().Configure().BuildSessionFactory();                 }                return _sessionFactory;            }        }    }}

 

-------從ISessionFactory中創(chuàng)建session

private ISession _session = HbmHelper.CurrentSessionFactory.OpenSession();

 

------添加數(shù)據(jù)訪問基類 BaseDal<T>

namespace Data{    /// <summary>    /// 數(shù)據(jù)訪問基類    /// </summary>    /// <typeparam name="T"></typeparam>    public class BaseDal<T> where T : class    {        //從ISessionFactory中創(chuàng)建session        private ISession _session = HbmHelper.CurrentSessionFactory.OpenSession();        #region ------------------   CURD    ----------------        /// <summary>        /// 添加數(shù)據(jù)        /// </summary>        /// <param name="model"></param>        public int Insert(T model)        {           int id=(int) _session.Save(model);            _session.Flush();            return id;        }        /// <summary>        /// 更新        /// </summary>        /// <param name="model"></param>        public void Update(T model)        {            //使用事務(wù)            using (ITransaction ts = _session.BeginTransaction())            {                try                {                    _session.Update(model);                    _session.Flush();                    ts.Commit();                }                catch (Exception)                {                    ts.Rollback();                    throw;                }            }        }        /// <summary>        /// 刪除        /// </summary>        /// <param name="model"></param>        public void Delete(T model)        {            _session.Delete(model);            _session.Flush();        }        /// <summary>        /// 查詢        /// </summary>        /// <param name="id"></param>        /// <returns></returns>        public T Query(int id)        {            return _session.Get<T>(id);        }                #endregion    }}

 

第七步:添加數(shù)據(jù),測試

7.1 添加數(shù)據(jù)

image_thumb1

7.2 創(chuàng)建單元測試項目,添加測試類:

namespace DataTest{    [TestClass]    public class BaseDalTest    {        private BaseDal<Customer> _customerDal = new BaseDal<Customer>();        [TestMethod]        public void GetTest()        {            var result = _customerDal.Query(1);            Assert.AreEqual(result.Name, "張小軍");        }        [TestMethod]        public void InsertTest()        {            Customer customer = new Customer()            {                Name = "張三",                Password = "654321",                UserName = "zhs"            };            int id = _customerDal.Insert(customer);            var result = _customerDal.Query(id);            Assert.AreEqual(customer.UserName, result.UserName);        }        [TestMethod]        public void UpdateTest()        {            var result = _customerDal.Query(1);            result.Name = "王五";            _customerDal.Update(result);            var r2 = _customerDal.Query(1);            Assert.AreEqual(result.Name,r2.Name);        }        [TestMethod]        public void DelTest()        {            var result = _customerDal.Query(1);            _customerDal.Delete(result);            var r2 = _customerDal.Query(1);            Assert.IsNotNull(r2);        }    }}

 

代碼:http://files.VEVb.com/files/zhxj/XShop0822.zip

原創(chuàng)文章,轉(zhuǎn)載請注明出處:http://www.survivalescaperooms.com/zhxj/      

 

 

2015.08.22 --張小軍


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 镇坪县| 重庆市| 肃宁县| 新邵县| 葫芦岛市| 呼玛县| 叙永县| 岐山县| 德州市| 江北区| 新邵县| 含山县| 平阳县| 明光市| 乡宁县| 梁山县| 大同市| 兴仁县| 武鸣县| 邯郸市| 仁怀市| 凌海市| 银川市| 城步| 涪陵区| 布拖县| 台南市| 卢龙县| 武威市| 马公市| 阿拉尔市| 玉龙| 贵阳市| 平阴县| 长葛市| 陇西县| 南江县| 仪征市| 乐业县| 左云县| 侯马市|