1. NHibernate简介
NHibernate是一个.NET对象关系映射(ORM)框架,它允许将C#(或VB.NET)类映射到关系数据库表中。 使用NHibernate,开发人员可以编写面向对象的代码而无需编写任何特定于数据库的SQL代码。 此外,NHibernate还提供了从.NET应用程序到关系数据库的透明数据持久性支持。
2. SQL Server与NHibernate
2.1 数据库配置
要使用NHibernate与SQL Server进行交互,需要首先在应用程序的配置文件中配置NHibernate以使用SQL Server数据库。 下面是一个示例配置文件:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section
name="hibernate-configuration"
type="NHibernate.Cfg.ConfigurationSectionHandler,NHibernate"
requirePermission="false" />
</configSections>
<connectionStrings>
<add
name="MyDatabase"
connectionString="Data Source=MySqlServer;Initial Catalog=MyDatabase;Integrated Security=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory name="mssql">
<property name="connection.provider">
NHibernate.Connection.DriverConnectionProvider
</property>
<property name="connection.driver_class">
NHibernate.Driver.SqlClientDriver
</property>
<property name="connection.connection_string_name">
MyDatabase
</property>
</session-factory>
</hibernate-configuration>
</configuration>
该配置文件中,我们指定了SQL Server数据库的连接字符串以及使用的NHibernate连接提供程序和驱动程序。我们还指定了会话工厂的名称为`mssql`。
2.2 数据映射
使用NHibernate与SQL Server进行交互时,需要将C#类映射到关系数据库表中,并使用配置文件中的SQL Server数据库。这是通过在一个XML文件中定义类映射来完成的。以下是一个示例映射文件:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="MyProject.Domain.Customer, MyProject.Domain" table="Customers">
<id name="Id">
<generator class="identity" />
</id>
<property name="Name" />
<property name="Email" />
<bag name="Orders" table="Orders" inverse="true" cascade="all">
<key column="CustomerId" />
<one-to-many class="MyProject.Domain.Order, MyProject.Domain" />
</bag>
</class>
<class name="MyProject.Domain.Order, MyProject.Domain" table="Orders">
<id name="Id">
<generator class="identity" />
</id>
<many-to-one name="Customer" class="MyProject.Domain.Customer, MyProject.Domain" column="CustomerId" />
<property name="OrderDate" />
</class>
</hibernate-mapping>
在此映射文件中,我们定义了一个`Customer`类和一个`Order`类与关系数据库的`Customers`表和`Orders`表进行映射。我们还为`Customer`类定义了一个子集`Orders`,用于该客户的所有订单。我们使用`many-to-one`元素指定订单中的客户外键。
3. MongoDB与NHibernate
3.1 数据库配置
要使用NHibernate与MongoDB进行交互,需要首先在应用程序的配置文件中配置NHibernate以使用MongoDB数据库。 下面是一个示例配置文件:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section
name="hibernate-configuration"
type="NHibernate.Cfg.ConfigurationSectionHandler,NHibernate"
requirePermission="false" />
</configSections>
<connectionStrings>
<add
name="MyDatabase"
connectionString="mongodb://localhost:27017/mydb"
providerName="MongoDB.Driver" />
</connectionStrings>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory name="mongo">
<property name="connection.provider">
NHibernate.Connection.DriverConnectionProvider
</property>
<property name="connection.driver_class">
NHibernate.MongoDB.MongoDriver
</property>
<property name="connection.connection_string_name">
MyDatabase
</property>
</session-factory>
</hibernate-configuration>
</configuration>
在此配置文件中,我们指定了MongoDB数据库的连接字符串并指定了使用的连接提供程序和驱动程序。我们还指定了会话工厂名称为`mongo`。
3.2 数据映射
使用NHibernate与MongoDB进行交互时,需要将C#类映射到MongoDB文档中,并使用配置文件中的MongoDB数据库。这是通过在一个XML文件中定义类映射来完成的。以下是一个示例映射文件:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="MyProject.Domain.Customer, MyProject.Domain" document-name="customers">
<id name="Id">
<generator class="native" />
</id>
<property name="Name" />
<property name="Email" />
<set name="Orders" inverse="true">
<key column="CustomerId" />
<one-to-many class="MyProject.Domain.Order, MyProject.Domain" />
</set>
</class>
<class name="MyProject.Domain.Order, MyProject.Domain" document-name="orders">
<id name="Id">
<generator class="native" />
</id>
<many-to-one name="Customer" class="MyProject.Domain.Customer, MyProject.Domain" column="CustomerId" />
<property name="OrderDate" />
</class>
</hibernate-mapping>
在此映射文件中,我们定义了一个`Customer`类和一个`Order`类与MongoDB文档的`customers`集合和`orders`集合进行映射。我们还为`Customer`类定义了一个子集`Orders`,用于该客户的所有订单。使用`many-to-one`元素指定订单中的客户外键。
4. 结论
通过NHibernate,我们可以使用相同的代码库将C#类映射到SQL Server和MongoDB数据库中。即使使用不同的数据库,映射文件中的大部分代码也可以重复使用。 这使得我们可以在不更改应用程序代码的情况下切换数据库,这是一个非常有用的特性。