许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  Fluent NHibernate入门教程

Fluent NHibernate入门教程

阅读数 2
点赞 0
article_banner

一.Fluent NHibernate是什么。

Fluent NHibernate提供了一个方法让你不再需要去写NHibernate的标准映射文件(.hbm.xml),而是可以把你的映射文件都使用C#来写。这样做,方便了我们的代码重构,提供了代码的易读性,并精简了项目代码。

它还包含了如下几个工具:

Fluent NHibernate是NHibernate核心代码的扩展,完全兼容NHibernate2.X。


二.为什么要用Fluent NHibernate。

NHibernate是一个非常好用的ORM工具,它的mapping都是以XML的形式定义的。每个类都有一个mapping文件映射到数据库对应的表。Fluent NHibernate取消了这些XML文件,既可以通过c#语言完成映射。


为什么要取代XML文件呢?

a.XML不是实时编译的。当你的XML配置文件有错误时,你只有在运行时才能看到哪里出错。

b.XML是非常繁琐的。的确在NHibernate中的配置文件,xml节点非常简单,但是仍然掩盖不了XML文件本身的繁琐性。

c.映射文件中重复的属性设置。比如在xml中我们需要设置每个string类型的字段都不允许为空,长度大于1000,int型都得有个默认值为-1,这样最终的xml配置文件你会发现有很多的重复工作。

Fluent NHibernate如何克服这些缺陷呢?

Fluent NHibernate把这些配置为文件都转化为了C#代码,这样可以让你的mapping直接在编译时就完成。


下面是传统的HBM XML mapping文件和Fluent NHibernate的对比。



三.如何使用Fluent NHibernate。

首先在vs解决方案上右键,选择“管理NuGet程序包”


然后在搜索栏中搜索Fluent,点击安装。

Fluent NHibernate是依托于NHibernate的,所以,安装Fluent NHibernate会自动安装NHibernate。


Fluent NHibernate只实现了NHibernate的mapping功能,其他功能还不能替代,所以我们需要使用NHibernate来创建Session来对数据库进行管理。



  using System;
 


  using System.Collections.Generic;
 


  using System.Linq;
 


  using System.Text;
 


  using System.Threading.Tasks;
 


  using NHibernate;
 


  using FluentNHibernate.Cfg;
 


  using FluentNHibernate.Cfg.Db;
 



  namespace ArpgDatabase
 


  {


      public class NHibernateHelper
 


      {


          private static ISessionFactory sessionFactory = null ;
 



          private static void InitializeSessionFactory()
 


          {


              sessionFactory = Fluently .Configure()
 


                  .Database( MySQLConfiguration .Standard.ConnectionString(db => db
 


                  .Server( "127.0.0.1 / localhost" )
 


                  .Database( "arpgdb" )
 


                  .Username( "root" )
 


                  .Password( "root" )))
 


                  .Mappings(m => m.FluentMappings.AddFromAssemblyOf< NHibernateHelper >())
 


                  //.ExposeConfiguration(e => e.Properties.Add("hbm2ddl.keywords", "none"))
 


                  .BuildSessionFactory();
 


          }
 



          private static ISessionFactory SessionFactory
 


          {


              get
 


              {


                  if (sessionFactory == null )
 


                      InitializeSessionFactory();
 



                  return sessionFactory;
 


              }
 


          }
 



          public static ISession OpenSession()
 


          {


              return SessionFactory.OpenSession();
 


          }
 


      }
 


  }
 


接下来我们在数据库中创建数据,我们以MySql为例。使用Navicat For MySql进行可视化数据库管理。

我们通过Mavicat创建一个叫做arpgdb的数据库,在数据库中创建一个叫做testuser的表,表中存在四个字段:id,username,pwd和lv



然后我们就可以创建映射类以及数据类了。


//数据类


  using System;
 


  using System.Collections.Generic;
 


  using System.Linq;
 


  using System.Text;
 


  using System.Threading.Tasks;
 



  namespace ArpgDatabase.Model
 


  -{


      class TestUser
 


      {


          public virtual int ID { get ; set ; }
 


          public virtual string Username { get ; set ; }
 


          public virtual string Password { get ; set ; }
 


          public virtual int Age { get ; set ; }
 


      }
 


  }
 


//映射类


  using System;
 


  using System.Collections.Generic;
 


  using System.Linq;
 


  using System.Text;
 


  using System.Threading.Tasks;
 


  using FluentNHibernate.Mapping;
 



  namespace ArpgDatabase.Model.Mapping
 


  {


      class TestUserMap : ClassMap<TestUser >


      {


          public TestUserMap()
 


          {


              //1、设置ID属性为主键
 


              //2、x表示一个TestUser的对象
 


              Id(x => x.ID).Column( "id" );
 


              Map(x => x.Username).Column( "username" );
 


              Map(x => x.Password).Column( "pwd" );
 


              Map(x => x.Age).Column( "lv" );
 


              Table( "testuser" );
 


          }
 


      }
 


  }
 


最后,我们就可以通过Session对数据库进行增删改查操作了!


  using ArpgDatabase.Model;
 


  using System;
 


  using System.Collections.Generic;
 


  using System.Linq;
 


  using System.Text;
 


  using System.Threading.Tasks;
 



  namespace ArpgDatabase.Manager
 


  {


      class TestUserManager
 


      {


          //取得所有用户
 


          public IList < TestUser > GetAllUser()
 


          {


              using ( var session = NHibernateHelper .OpenSession())
 


              {


                  using ( var transaction = session.BeginTransaction())
 


                  {


                      var userList = session.QueryOver< TestUser >();
 


                      transaction.Commit();
 


                      return userList.List();
 


                  }
 


              }
 


          }
 



          //条件查询
 


          public IList < TestUser > GetUserByUsername( string username)
 


          {


              using ( var session = NHibernateHelper .OpenSession())
 


              {


                  using ( var transaction = session.BeginTransaction())
 


                  {


                      var userList = session.QueryOver< TestUser >().Where(user => user.Username == username);
 


                      transaction.Commit();
 


                      return userList.List();
 


                  }
 


              }
 


          }
 



          //保存数据
 


          public void SaveUser( TestUser user)
 


          {


              using ( var session = NHibernateHelper .OpenSession())
 


              {


                  using ( var transaction = session.BeginTransaction())
 


                  {


                      session.Save(user);
 


                      transaction.Commit();
 


                  }
 


              }
 


          }
 



          //通过id删除数据
 


          public void DeleteByID( int id)
 


          {


              using ( var session = NHibernateHelper .OpenSession())
 


              {


                  using ( var transaction = session.BeginTransaction())
 


                  {


                      TestUser tu = new TestUser ();
 


                      tu.ID = id;
 


                      session.Delete(tu);
 


                      transaction.Commit();
 


                  }
 


              }
 


          }
 



          //修改数据的方法
 


          public void UpdateUser( TestUser tu)
 


          {


              using ( var session = NHibernateHelper .OpenSession())
 


              {


                  using ( var transaction = session.BeginTransaction())
 


                  {


                      session.Update(tu);
 


                      transaction.Commit();
 


                  }
 


              }
 


          }
 



          static void Main( string [] args)
 


          {


              TestUserManager testUserManager = new TestUserManager ();
 


              IList < TestUser > testUserList = testUserManager.GetAllUser();
 


              foreach ( TestUser tu in testUserList)
 


              {


                  Console .WriteLine(tu.Username);
 


              }
 



              Console .WriteLine( "___________________________________________" );
 



              IList < TestUser > testUserList2 = testUserManager.GetUserByUsername( "hehe" );
 


              foreach ( TestUser tu in testUserList2)
 


              {


                  Console .WriteLine(tu.Username);
 


              }
 



              Console .WriteLine( "___________________________________________" );
 



              //TestUser tu2 = new TestUser();
 


              //tu2.Username = "bawei";
 


              //tu2.Age = 6;
 


              //testUserManager.SaveUser(tu2);
 



              //TestUser tu3 = testUserList2[0];
 


              //tu3.Username = "nidaye";
 


              //testUserManager.UpdateUser(tu3);
 




              Console .ReadKey();
 


          }
 


      }
 


  }
 


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

相关文章
技术文档
QR Code
微信扫一扫,欢迎咨询~
customer

online

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 board-phone 155-2731-8020
close1
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空