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 自定義輸出映射方法
有的時候我們在映射的時候,有一些列需要特殊的處理。