Fluent NHibernate入门

仇建茗
2023-12-01
一.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();
        }
    }
}
 类似资料: