程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> Enterprise Library(企業庫)給我們提供的ORM

Enterprise Library(企業庫)給我們提供的ORM

編輯:關於.NET

1 引言

本文的使用的實例數據庫為:Northwind

企業庫版本:V5.0

下面的例子均在ASP.NET中進行演示。

ORM,Object Relation Mapper,主要是說我們的編程語言,尤其是我們使用 面向對象編程語言的時候,都在使用對象,實體,Object,對象之間用屬性來維 護數據關系。也就是1:n,n:1,1:1,n:n等等。在配合數據庫開發的時候,使用的 大多是關系型數據庫,關系型數據庫靠關系Relation來維護數據,表現形式就是 二維的數據表。

對象和關系不是一一映射的關系。就好像一張數據庫的表,這樣一個二維關 系,映射為C#中的對象的話,可能是多個對象。還有可能幾張表映射為一個對象 。很少有一張表映射為一個對象。因為類的設計和數據庫表的設計不是一種思路 ,他們的規范也不盡相同。

這時候就引出了ORM,對象和關系之間的映射。如何更好的映射?都是很多人 研究的課題。我也寫過一篇文章,討論過一種實現方法。大多數的方法都是利用 列名和屬性名來實現映射。

其實在企業庫中,至少是在V5.0中就存在這樣的映射輔助類,今天就讓我們 來看看企業庫中提供給我們的ORM映射工具。

2 正文

2.1 簡單應用

在web.config文件中添加下面的配置

代碼

<configSections>
     <section name="dataConfiguration"  type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.Databas eSettings, Microsoft.Practices.EnterpriseLibrary.Data,  Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"  requirePermission="true" />
   </configSections>
   <dataConfiguration defaultDatabase="sql2005dev" >
   </dataConfiguration>
   <connectionStrings>
     <add name="sql2005dev" connectionString="server=KB- SHIWENBIN\SQL2005DEV;database=northwind;uid=sa;pwd=123.com"  providerName="System.Data.SqlClient"/>
   </connectionStrings>

在一個頁面的後台代碼中敲下如下面的代碼

代碼

Database db=DatabaseFactory.CreateDatabase ();
                 IRowMapper<Customer>  mapper = MapBuilder<Customer>.BuildAllProperties () ;
                 var accessor =  db.CreateSprocAccessor<Customer>("GetAllFromCustomers");

                 var customerData =  accessor.Execute();
                 foreach (var c in  customerData)
                 {
                     Response.Write (c.CompanyName);
                     Response.Write ("</br>");
                 }

GetAllFromCustomers為存儲過程的名稱

代碼

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER PROCEDURE [dbo].[GetAllFromCustomers]
AS
BEGIN
     --SET NOCOUNT ON

     SELECT
     [customers].[Address] AS 'Address',
     [customers].[City] AS 'City',
     [customers].[CompanyName] AS 'CompanyName',
     [customers].[ContactName] AS 'ContactName',
     [customers].[ContactTitle] AS 'ContactTitle',
     [customers].[Country] AS 'Country',
     [customers].[CustomerID] AS 'CustomerID',
     [customers].[Fax] AS 'Fax',
     [customers].[Phone] AS 'Phone',
     [customers].[PostalCode] AS 'PostalCode',
     [customers].[Region] AS 'Region'
FROM [dbo].[Customers] [customers]
     SET NOCOUNT OFF
END

定義實體類

代碼

public class Customer
     {
         public string CustomerID { get; set; }
         public string CompanyName { get; set; }
         public string ContactName { get; set; }
         public string ContactTitle { get; set; }
         public string Address { get; set; }
         public string City { get; set; }
         public string Region { get; set; }
         public string PostalCode { get; set; }
         public string Country { get; set; }
         public string Phone { get; set; }
         public string Fax { get; set; }
     }

這樣就可以了,可以看到從數據庫讀取customer信息,然後映射為實體集合 。database的CreateSprocAccessor方法配合存儲過程使用, CreateSqlStringAccessor方法配合sql語句使用。

2.2 如何傳入參數

其實我們很多時候需要執行的sql語句和存儲過程都會有參數傳入。這裡假設 我們需要執行的sql語句是

SELECT * from Customers WHERE CompanyName like @p1  and contactname like @p2

有兩個參數@p1,@p2

首先我們需要自定義一個參數映射類

代碼

public class ExampleParameterMapper :  IParameterMapper
     {
         public void AssignParameters(DbCommand command,  object[] parameterValues)
         {
             DbParameter parameter =  command.CreateParameter();
             parameter.ParameterName = "@p1";
             parameter.Value = parameterValues[0];
             command.Parameters.Add(parameter);
             parameter = command.CreateParameter ();
             parameter.ParameterName = "@p2";
             parameter.Value = parameterValues[1];
             command.Parameters.Add(parameter);
         }
     }

然後我們將c#的代碼修改一下,在創建訪問器的時候指定一下參數映射實例 ,在執行的時候傳入參數的值。

代碼

Database db=DatabaseFactory.CreateDatabase ();

                 string query = "SELECT *  from Customers WHERE CompanyName like @p1 and contactname like  @p2";
                 IParameterMapper mapper =  new Classes.ExampleParameterMapper ();
                 var accessor =  db.CreateSqlStringAccessor<Customer>(query, mapper);
                 var customerData =  accessor.Execute(new string[] { "%stock%", "%s%" });
                 foreach (var c in  customerData)
                 {
                     Response.Write (c.CompanyName);
                     Response.Write ("</br>");
                 }

這樣就可以了。

2.3 定義輸出結果的映射關系

2.3.1 使用默認的輸出映射方法

在你創建SprocAccessor和SqlStringAccessor類的時候,或者是使用 database的CreateSqlStringAccessor和CreateSpocAccessor的時候,不需要你 提供輸出映射的方法。默認的情況下,使用數據庫結果集中的列的名稱和類的屬 性的名稱進行映射,如果一個屬性沒有找到匹配的列,就會拋出 InvalidOperationException的異常提示。如果結果集中的列,沒有類屬性對應 的話,就不做任何處理,忽略這個列。另外,默認的映射方法不支持集合屬性的 映射。

2.3.2 自定義輸出映射方法

有的時候我們在映射的時候,有一些列需要特殊的處理。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved