NHibernate是一款開源的ORM框架,現在被廣泛應用于數據訪問層的開發。NHibernate的功能豐富,它可以支持各種數據庫,包括Oracle數據庫。下面我們就來看看如何使用NHibernate鏈接Oracle數據庫。
首先,我們需要在項目中引入NHibernate和Oracle.Data.dll的相關包。
<package id="NHibernate" version="5.2.3.0" targetFramework="net452" />
<package id="Oracle.ManagedDataAccess" version="12.1.24160419" targetFramework="net452" />
然后,我們需要在Web.config或App.config中配置數據庫鏈接信息。
<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需要修改成自己的實際信息。這里我們采用使用Oracle.ManagedDataAccess提供的OracleManagedDataClientDriver,其主要優勢是支持.NET Framework和.NET Core平臺,提供更高的性能和安全性。
接下來,我們需要定義實體和映射文件,在這里我們創建一個名為Student的實體類及其映射文件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進行數據操作了。這里我們通過一個簡單的示例來說明如何實現使用NHibernate鏈接Oracle數據庫,并進行數據的增刪查改操作。
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())
{
//數據插入
Student stu = new Student()
{
Name = "Tom",
BirthDate = new DateTime(1990, 5, 5)
};
session.Save(stu);
//數據查詢
var list = session.CreateCriteria(typeof(Student)).List();
foreach (var item in list)
{
Console.WriteLine($"ID:{item.Id},Name:{item.Name},BirthDate:{item.BirthDate}");
}
//數據更新
Student stu2 = new Student()
{
Id = 1,
Name = "Tom2",
BirthDate = new DateTime(1992, 5, 5)
};
session.Update(stu2);
//數據刪除
var stu3 = session.Get<Student>(1);
session.Delete(stu3);
session.Flush();
}
Console.ReadLine();
}
}
NHibernate使用簡單,且易于擴展和維護。我們可以通過學習NHibernate的使用,快速地完成對Oracle數據庫的訪問。當然,缺點也是顯而易見的,如使用NHibernate進行數據操作,性能會有所下降,需要更多的系統資源才能達到和手寫SQL相同的性能表現。