65.9K
CodeProject 正在变化。 阅读更多。
Home

简单的对象关系映射

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.68/5 (5投票s)

2008年3月19日

CPOL

2分钟阅读

viewsIcon

24731

downloadIcon

243

一个非常简单的 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

© . All rights reserved.