NHibernate是一款開源的ORM框架,現(xiàn)在被廣泛應(yīng)用于數(shù)據(jù)訪問層的開發(fā)。NHibernate的功能豐富,它可以支持各種數(shù)據(jù)庫,包括Oracle數(shù)據(jù)庫。下面我們就來看看如何使用NHibernate鏈接Oracle數(shù)據(jù)庫。
首先,我們需要在項(xiàng)目中引入NHibernate和Oracle.Data.dll的相關(guān)包。
<package id="NHibernate" version="5.2.3.0" targetFramework="net452" />
<package id="Oracle.ManagedDataAccess" version="12.1.24160419" targetFramework="net452" />
然后,我們需要在Web.config或App.config中配置數(shù)據(jù)庫鏈接信息。
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<property name="connection.driver_class">NHibernate.Driver.OracleManagedDataClientDriver</property>
<property name="connection.connection_string">Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=xxx.xxx.xxx.xxx)(PORT=1521)))(CONNECT_DATA=(SID=xxxx)));User ID=xxxx;Password=xxxx;</property>
<property name="dialect">NHibernate.Dialect.Oracle12cDialect</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
</session-factory>
</hibernate-configuration>
其中,connection_string需要修改成自己的實(shí)際信息。這里我們采用使用Oracle.ManagedDataAccess提供的OracleManagedDataClientDriver,其主要優(yōu)勢是支持.NET Framework和.NET Core平臺(tái),提供更高的性能和安全性。
接下來,我們需要定義實(shí)體和映射文件,在這里我們創(chuàng)建一個(gè)名為Student的實(shí)體類及其映射文件Student.hbm.xml。
//Student.cs
public class Student
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual DateTime BirthDate { get; set; }
}
//Student.hbm.xml
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="Student" table="Student">
<id name="Id" column="Id">
<generator class="identity" />
</id>
<property name="Name" column="Name" />
<property name="BirthDate" column="BirthDate" />
</class>
</hibernate-mapping>
最后,我們就可以使用NHibernate進(jìn)行數(shù)據(jù)操作了。這里我們通過一個(gè)簡單的示例來說明如何實(shí)現(xiàn)使用NHibernate鏈接Oracle數(shù)據(jù)庫,并進(jìn)行數(shù)據(jù)的增刪查改操作。
using NHibernate;
using NHibernate.Cfg;
using System;
class Program
{
static void Main(string[] args)
{
Configuration cfg = new Configuration();
cfg.Configure();
ISessionFactory sessionFactory = cfg.BuildSessionFactory();
using (ISession session = sessionFactory.OpenSession())
{
//數(shù)據(jù)插入
Student stu = new Student()
{
Name = "Tom",
BirthDate = new DateTime(1990, 5, 5)
};
session.Save(stu);
//數(shù)據(jù)查詢
var list = session.CreateCriteria(typeof(Student)).List();
foreach (var item in list)
{
Console.WriteLine($"ID:{item.Id},Name:{item.Name},BirthDate:{item.BirthDate}");
}
//數(shù)據(jù)更新
Student stu2 = new Student()
{
Id = 1,
Name = "Tom2",
BirthDate = new DateTime(1992, 5, 5)
};
session.Update(stu2);
//數(shù)據(jù)刪除
var stu3 = session.Get<Student>(1);
session.Delete(stu3);
session.Flush();
}
Console.ReadLine();
}
}
NHibernate使用簡單,且易于擴(kuò)展和維護(hù)。我們可以通過學(xué)習(xí)NHibernate的使用,快速地完成對Oracle數(shù)據(jù)庫的訪問。當(dāng)然,缺點(diǎn)也是顯而易見的,如使用NHibernate進(jìn)行數(shù)據(jù)操作,性能會(huì)有所下降,需要更多的系統(tǒng)資源才能達(dá)到和手寫SQL相同的性能表現(xiàn)。