Fluent NHibernate入门
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 { 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 = "bisheng";
//tu2.Age = 6;
//testUserManager.SaveUser(tu2);
//TestUser tu3 = testUserList2[0];
//tu3.Username = "bixian";
//testUserManager.UpdateUser(tu3);
Console.ReadKey();
}
}
}