- 浏览: 477029 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (1028)
- [发布至博客园首页] (826)
- [随笔分类]个人生活随笔 (14)
- [网站分类]首页候选区 (26)
- [网站分类]SharePoint (15)
- [网站分类]其他技术区 (6)
- [随笔分类]批处理技巧 (6)
- [随笔分类].net 2.0 (3)
- [随笔分类]SharePoint2007(MOSS2007) (0)
- [网站分类].NET新手区 (6)
- [网站分类]ASP.NET (6)
- [网站分类]架构设计 (18)
- [网站分类]程序人生 (2)
- [网站分类]SQL Server (2)
- WCF (3)
- 编程技巧 (2)
- 模式架构 (2)
- 分析设计 (4)
- 生活随笔 (0)
- 软件工程 (1)
- Android实例 (2)
最新评论
-
zilong0536:
楼主您好:
请问发表博文支持图片的功能怎么实现啊,一直没有思路 ...
新浪微博开放平台开发-android客户端(3) -
nicegege:
小弟 学习了
帮助中国移动设计10086的排队小模块 -
zl7824516:
用什么技术没说啊
通告(公告),消息(站内短信),提醒的设计:通告 -
virusswb:
源码下载: SinaWeibo2 源码下载之后,将后缀改为ra ...
新浪微博开放平台开发-android客户端(3) -
Jimmyxu0311:
找不到源码下载
新浪微博开放平台开发-android客户端(3)
Enterprise Library(企业库)给我们提供的ORM
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文件中添加下面的配置
<section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings, 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>
在一个页面的后台代码中敲下如下面的代码
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 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 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语句是
有两个参数@p1,@p2
首先我们需要自定义一个参数映射类
{
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#的代码修改一下,在创建访问器的时候指定一下参数映射实例,在执行的时候传入参数的值。
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 自定义输出映射方法
有的时候我们在映射的时候,有一些列需要特殊的处理。
发表评论
-
NET 应用架构指导 V2 学习笔记(十六) 服务层设计指导
2010-06-04 00:13 529如果你的应用是通 ... -
NET 应用架构指导 V2 学习笔记(十七) 组件设计指导
2010-06-05 00:48 633组件提供了一种将 ... -
NET 应用架构指导 V2 学习笔记(十八) 表现层组件设计指导
2010-06-05 21:09 501本章讲述的是你在设计用户界面组件和表现层逻辑组件的时候应该 ... -
NET 应用架构指导 V2 学习笔记(十九) 表现层组件设计指导
2010-06-06 06:15 5665 决定数据绑定的 ... -
NET 应用架构指导 V2 学习笔记(二十) 业务组件设计指导
2010-06-07 06:58 586前言 业务组件 ... -
微软企业库5.0学习笔记(四十二)异常处理模块
2010-06-14 00:04 812企业库的异常处理 ... -
关于程序员在30岁、35岁之后怎么办的新思考
2010-06-14 10:40 600首先给大家问个好 ... -
NET 应用架构指导 V2 学习笔记(二十四) 跨层关注问题
2010-06-17 20:00 558概况 大部分的 ... -
微软企业库5.0学习笔记(四十三)数据验证模块
2010-06-19 08:07 970概况 任何接受用户或者是其他系统输入的应用,一定要确保 ... -
关于项目进度慢的思考----如何提高整体开发效率
2010-06-21 23:42 777我们都是软件行业 ... -
微软企业库5.0学习笔记(四十四)实战数据验证模块
2010-06-23 19:22 8001 在业务对象上添加验证 添加对程序集【Microso ... -
微软企业库5.0学习笔记(四十五)实战数据验证模块----高级篇
2010-06-24 19:41 9541、添加自定义的提示信息 验证失败的提示信息可以自定义 ... -
面向对象类设计的五大原则(一)单一职责原则Single Responsibility Principle
2010-06-29 15:45 741引言 面向对象类设计,或者说是面向对象设计,有五大原则 ... -
《深入浅出设计模式-中文版》读书笔记 开篇乱弹(一)
2010-07-01 06:42 628oreilly的《Head.First ... -
《深入浅出设计模式-中文版》读书笔记-继承与组合(三)
2010-07-03 16:53 582经过上一次的改造 ... -
《深入浅出设计模式-中文版》读书笔记-观察者模式(四)
2010-07-06 06:34 608今天要接触的是观 ... -
利用attribute实现简单的ORM
2010-07-09 15:27 652我不知道NH的ORM具 ... -
系统内部模块(子系统)之间的耦合以及模块(子系统)划分
2010-07-14 13:02 791题外话 最近已经在努力学习了,学习基本功,学习设计模式 ... -
《深入浅出设计模式-中文版》读书笔记-工厂模式(五)
2010-07-16 12:46 673今天给大家带来的是:工厂模式。 我们在代码中创建一个对 ... -
Head.First.Object-Oriented.Design.and.Analysis《深入浅出面向对象的分析与设计》读书笔记(一)
2010-07-18 21:47 642题外话 又是一本Head.First系列的书,这个系列 ...
相关推荐
超级好用的golang实现orm库的示例代码
简单易用的基于SQLite3的C++ ORM框架
Go Golang的ORM库
SQLite ORM:用于现代C 的SQLite ORM库,只有header
资源分类:Python库 所属语言:Python 资源全名:SQLAlchemy-ORM-tree-0.0.7.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
python库。资源全名:fastorm-0.0.5.tar.gz
hsweb-easy-orm, 简单的orm工具,为动态表单而生
TMS Business Core Library Aurelius is an Object-Relational Mapping (ORM) .zip
能实现基本的数据库操作能实现基本的数据库操作
资源分类:Python库 所属语言:Python 使用前提:需要解压 资源全名:dgraph_orm-0.1.52-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
这里面包括了Hibernate和MyBatis的实现ORM思想的原理,以及讲解了什么是ORM思想。仿照Hibernate自定义了一个简单的增删改查的ORM框架,还有测试代码。
Sqlite ORM 是一个简单的C#类,对Sqlite的操作进行了封装,主要功能包括:表定义、生成,访问,更新等,其中,支持,多表的连接操作,语法类似Linq语法,使用非常方便,附加了使用说明文档。 例如,添加记录操作为...
YB.ORM 库的目标是简化编写C++代码中处理SQL数据库。我们的目标是提供一个方便的接口,类似 SQLAlchemy或Hibernate(JAVA)。 库本身是跨平台的,支持各种SQL方言:如 sqlite、MySQL、Postgres、Oracle 等。
ORM框架 C#.NET ORM框架ORM框架 C#.NET ORM框架ORM框架 C#.NET ORM框架ORM框架 C#.NET ORM框架
Net下ORM框架概述,仅供参考,ORM是企业开放的热门技术
Idiorm 是一款轻量级的ORM库,建立在PDO之上的PHP5查询构造器。 示例代码: $user = ORM::for_table('user') ->where_equal('username', 'j4mie') ->find_one();$user->first_name = 'Jamie';$user->save()...
一句话简介:Doc.ORM是用来给系统或网站的数据库进行,增删改查等操作的。 说明:本Demo致力于介绍Doc.ORM的基本功能,增、删、改、查,一看就会,轻松入门。 注:内含Demo必须的《实体生成工具》,要使用Doc.ORM...
python库。 资源全名:fox_orm-0.1.5-py3-none-any.whl
python库。 资源全名:towel-orm-0.0.1.tar.gz
python库。 资源全名:spanner-orm-0.2.2.tar.gz