一.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();
}
}
}