简单的对象关系映射
一个非常简单的 ORM 类。它没有其他 ORM 框架的所有功能,但对于较小的项目来说,它可能是一个简单的解决方案。
引言
这里有一个非常简单的 ORM 类。它没有其他 ORM 框架的所有功能,但对于较小的项目来说,它可能是一个简单的解决方案。
如果您需要研究更强大的 ORM 框架,请查看 Spring.Net 和 NHibernate、LINQ to SQL 以及 LINQ to Entities,或者其他许多框架。
不要关注数据访问应用程序块,因为它不执行对象关系映射,它只是一个抽象 ADO.NET 功能的工厂。
使用代码
首先,您需要 DataMapper
类(本文档中的附件)。我使用了从 CSLA .NET 框架 中汲取的想法。
接下来,创建一个业务对象
using System;
namespace ASPNET.StarterKit.Portal.BusinessLayer.BusinessObjects
{
[Serializable]
public class PortalHtmlText
{
private int _ModuleID;
private string _DesktopHtml;
private string _MobileSummary;
private string _MobileDetails;
public int ModuleID
{
get { return _ModuleID; }
set { _ModuleID = value; }
}
public string DesktopHtml
{
get { return _DesktopHtml; }
set { _DesktopHtml = value; }
}
public string MobileSummary
{
get { return _MobileSummary; }
set { _MobileSummary = value; }
}
public string MobileDetails
{
get { return _MobileDetails; }
set { _MobileDetails = value; }
}
}
}
在数据库中创建一个表
CREATE TABLE [dbo].[Portal_HtmlText](
[ModuleID] [int] NOT NULL,
[DesktopHtml] [ntext] NOT NULL,
[MobileSummary] [ntext] NOT NULL,
[MobileDetails] [ntext] NOT NULL
)
我们需要一个类似于下面的连接字符串
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="ConnectionString"
connectionString="server=.\SQLEXPRESS;
Trusted_Connection=true;database=Portal"
providerName="System.Data.SqlClient" />
</connectionStrings>
</configuration>
最后,让我们获取表的所有行并进行映射
string dataProvider =
ConfigurationManager.ConnectionStrings["ConnectionString"].ProviderName;
string connectionString =
ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
DbProviderFactory factory = DbProviderFactories.GetFactory(dataProvider);
DbConnection connection = factory.CreateConnection();
connection.ConnectionString = connectionString;
connection.Open();
DbCommand command = factory.CreateCommand();
command.Connection = connection;
command.CommandType = CommandType.Text;
command.CommandText = "SELECT * FROM Portal_HtmlText";
IDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection);
IList<PortalHtmlText> list = DataMapper.MapList<PortalHtmlText>(reader);
如果您分析 DataMapper
类,您会很容易理解数据读取器应该返回与业务对象具有相同列名的列。我知道这是一种严格的假设,但如果您能够做到,那么就可以轻松地将数据库对象映射到业务对象。在用 AQTime 和 DotTrace 进行分析后,我发现映射大约占总操作的 3%,其余都与数据库相关。此外,真正可以提高性能的地方是使用数据读取器而不是数据集。使用 ORM,您需要将业务对象传输到另一端,而不是断开连接的数据集。因此,我相信,通常情况下,您会获得性能提升。
另一个值得一提的点是,如果数据读取器中存在的列在业务对象中不存在作为公共属性,会发生什么。在这种情况下,会抛出一个异常,并且通过良好的单元测试,您应该尽早发现这种缺陷。
有关更多示例,请查看此 链接,我在这里广泛使用了这个 DataMapper
。