一.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();
}
}
}
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删