Fluent NHibernate入门

来源:互联网 发布:张学友唱功 知乎 编辑:程序博客网 时间:2024/06/14 14:50

                                           Fluent NHibernate入门

.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程序包”

         Nuget是一个.NET平台下的开源的项目,它是Visual Studio的扩展。在使用Visual Studio开发基于.NET Framework的应用时,Nuget能把在项目中添加、移除和更新引用的工作变得更加快捷方便。Nuget是 ASP .NET Gallery 的一员。NuGet 是免费、开源的包管理开发工具,专注于在 .NET 应用开发过程中,简单地合并第三方的组件库。当需要分享开发的工具或是库,需要建立一个Nuget package,然后把这个package放到Nuget的站点。如果想要使用别人已经开发好的工具或是库,只需要从站点获得这个package,并且安装到自己的Visual Studio项目或是解决方案里。

NuGet能更方便地把一些dll和文件(如jquery)添加到项目中,而不需要从文件中复制拷贝

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

 

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( "arpg")

                .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创建一个叫做arpg的数据库,在数据库中创建一个叫做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 { getset ; }

        public virtual string Username { getset ; }

        public virtual string Password { getset ; }

        public virtual int Age { getset ; }

    }

}

 

//映射类

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属性为主键

            //2x表示一个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 = "bisheng";

            //tu2.Age = 6;

            //testUserManager.SaveUser(tu2);

 

            //TestUser tu3 = testUserList2[0];

            //tu3.Username = "bixian";

            //testUserManager.UpdateUser(tu3);

 

 

            Console.ReadKey();

        }

    }

}

 

原创粉丝点击