`
izuoyan
  • 浏览: 9216819 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

ORM in .NET 3.5

阅读更多

出处:http://i.aspx1.com/showtopic-710.htm

作者:Luke Stratman
原文链接:http://dotnetslackers.com/articles/net/ORMInNET35.aspx
Introduction
ORM,对象-关系映射,在现代面向对象编程语言中,其中实现起来比较棘手的事。它包括摒弃传统的数据存储机制:这里没有(或很少)专门的、预编译的代码,涉及读(写)对象从(到)数据库或其它后备存储中。作为替代,涉及访问后备存储的逻辑在运行时被决定,通过运用一系列反射和特性机制修饰正在考虑的业务对象。许多已经建立的工程和框架试图提出这个观念并取得了多方面的成功。这篇文章覆盖了:概括介绍ORM理念,一种.NET3.5携带的途径,及其和其他框架的比较。

In the beginning...

在.NET3.5之前,当你需要把你的业务对象从数据库读取或写入时,你有以下几个选择:

1.
自己动手 – 这意味着你不需要任何框架,不需要自动生成任何代码。数据库结构和.NET类都是手工建立的,数据访问层也是如此。虽然这将会提供最终的执行,但是当对象或数据库结构改变时,它将是乏味的(包括复制大量重复代码),易出错的,难以维护的。

2.
自动生成类和数据访问层 – 这就是自动生成工具CodeSmith和MyGeneration到来的缘由:你在你的数据库中指明它们,它将自动生成.NET类和数据访问层。看看第一条选择,这不是真正的ORM:你仍然有预编译代码负责访问数据库用来读取或写入对象的数据。不过,它的自动生成代码机制在这方面做出了正确的一步,排除了当创建类和数据访问层时易出错的人为因素。

3.
运用真正的ORM框架 – 在先前的.NET框架版本中,这里有一些知名的ORM框架可获取,包括NHibernate和Gentle.NET。就如事先提到的,ORM移除了专注于数据存储的代码和在运行时检查一个对象来决定从数据库读取或写入这个对象需要做哪些工作。特性用来修饰类和类的属性,用以给出标识类和数据库的映射。一个操作的真实SQL是基于这些特性动态生成的。经常有一个代码自动生成组件在这些框架中用来从数据库结构中生成业务对象类,但是关注于数据访问的代码没有生成。


Major Malfunctions(缺点) with ORM

所有这些动态的,运行时的SQL生成机制听起来不错,是么?并非如此:ORM有一些严重的缺点。第一个就是性能问题,因为在任何时候你把反射引入并开始动态生成SQL,你会遭遇减速。ORM永远不会和自己手动处理一样快:没有替代品可以替代“手拧”存储过程和预编译所有数据访问逻辑。另一个缺点是ORM对极度复杂的数据库处理的不好。当设计很多约束和关系跨越多个表的复杂数据库时,这经常有必要包括中间表去把各种实体关联起来,这从RDBMS的立场看似乎不错,但是在一个面向对象环境中看起来有点牵强。这也将导致难以理解自动生成的类。紧记,RDBMS和面向对象环境是根本不同的,它们各自拥有一套设计和性能考量。在一个环境中动作良好并不意味在另一个环境中亦如此。话虽如此,ORM以可维护、干净的、易懂的代码的方式提供正确的使用总是比较牵强的。

LINQ, DataContexts, and general ORM in .NET 3.5


目前为止,你对ORM已经有了整体的了解和它潜在的陷阱,让我们探讨一下Microsoft在.NET3.5中是如何接近这个观念的。它提出了一个不同的途径去挑战ORM,它并不把焦点集中在对象模型、关系模型,它提供给我们一套全新的思路去访问和查询数据,这并不局限于关系数据。通过这个途径,.NET3.5的ORM能力发展成了这个新的数据访问架构,几乎如同副作用一般,取代了原来的焦点。他们是怎样做到的?LINQ。它代表集成查询语言,Microsoft想把它变成在.NET框架中筛选数据的途径。它的结构与我们平时写SQL语句很类似,它非常简单,并且拥有对强类型面向对象语言强有力的SQL查询语法。实际的反对者,然而,是它不仅仅局限于关系数据:只要实现了IEnumerable和IQueryable接口,就能使用LINQ。这里有一个例子,你可以从中知道它的能力:

List<string> elements = new List<string>(){"Iridium","Einsteinium","Polonium"};IEnumerable<string> results = from element in elementswhere element.Contains("n")select element;
这只是一个简单的从elements中查询包含字母”n”的普通字符串例表实例。然而在之前你不得不命令式地完成这项功能,也就是你将不得不写代码迭代集合来驱动查询,现在你可以直接地完成相同的功能。基本上,你陈述你要做什么来替代如何去做。当用这种语法,这种途径固有地不太会出错。它同样也支持提及的智能感知,所以当你从事于LINQ编程时,你一点也不会在Visual Studio中损失轻松使用的特征。

那么,我们来看看LINQ是如何适合ORM的。第一,这里有一个代码生成组件:LINQ并没有避开它由于你不得不定义映射数据库中的关系数据为类似于面向对象世界的类。为了做到这一点,Microsoft提供一个叫做SQLMetal的工具。为了使用它,仅仅打开Visual Studio命令行提示(Start->Programs->Visual Studio 9.0->Visual Studio Tools->Visual Studio Codename Orcas Command Prompt),然后打上sqlmetal来看看它的选项。它非常简单:你所需要做的是指明它的数据库,告诉代码文件的名称和(或)你想要生成的DBML文件。我创建了一个简单的名为LinqTest的数据库,它包含两张表:Person和PersonAddress。PersonAddress有一名为personId的列,它是一个外部键,用来关联Person表中相匹配的列。所以,我运用如下命令产生ORM类:

sqlmetal /database:LinqTest /language:csharp /code:LinqTest.cs


从这个过程得到的代码结果中包含两套类:DataContext类和一系列与数据库中表相符的对象类。对象类非常简单:它们反映出数据库中的表,其中的属性代表每个列。每个类和其属性都被特性修饰,来描述和数据库之间的映射,这和其他ORM框架类似。一个很好的提高是我并没有在任何地方发现,除非每个对象类自动执行INotifyPropertyChanging和INotifyPropertyChanged,这意味着它们暴露了当一个属性的值改变时允许外界类去响应的事件。为了促进这一点,要点是每个属性包装到OnPropertyChanging()和OnPropertyChnaged回调方法,依次触发事件处理函数,如果它们设置了。另一个漂亮的特征是这样一个事实,所有由SQLMetal产生的类都是部分类,它们仅仅实现必要的核心功能。这意味着你可以通过分离代码文件自由的添加类功能,不需要更新自动生成的输出。DataContext类提供链接到包含将用于移植到对象类的数据的后备存储的服务(在这个例子里是数据库)。你通过一个连接字符串或一个初始化了的数据连接对象来得到它的构造器,依次,它暴露一系列泛型属性Table<>,其中每个都代表数据库中的一张表。这些Table<>属性是真正给予LINQ力量的:Table<>类是完全支持LINQ的,它负责于扮演LINQ与数据库间的接口,将LINQ语法翻译成必要的SQL语句,从而从数据库中检索你的数据。同样地对于先前的例子,让我们来看看另一个使用Table<>属性的LINQ查询:

LinqTest linqTest = new LinqTest("Data Source=DDVPC01""SQLEXPRESS;Initial Catalog=LinqTest;Integrated Security=True");IEnumerable<Person> results = from person in linqTest.Personwhere person.FirstName.StartsWith("L")select person;


所有这些讲述了ORM实现是如何地困难,鉴于在.NET3.5中其他的看起来有点虎头蛇尾:它对于有SQL经验的非常容易懂,它完全集成于语言及开发环境,而且它令人惊讶的快。想添加一个新Person信息到数据库?没问题:

linqTest.Person.Add(new Person(){FirstName = "Mike",LastName = "Smith"});linqTest.SubmitChanges();

只要你调用必要的Table<>属性的Add()方法,做完这步之后,调用DataContext类的SubmitChanges()方法。

Wrapping it up 总结

我希望这篇文章能给你一些好的建议对于在.NET3.5中处理ORM。这并不是解决所有挑战数据访问的银弹,但就如任何一个优秀的程序员所知,这从来就没有。当数据库结构很复杂并且性能至关重要时,这里就没有办法替代手工写代码,调整.NET数据访问代码和SQL逻辑。但是,至于明确的结构和.NET中一般的数据过滤,LINQ表现为一种新的,诡秘的ORM实现。


posted on 2008-05-03 00:37 nicholas.sun
本文来自: ASP.NET学习门户(http://www.aspx1.com) 详细出处参考:http://i.aspx1.com/showtopic-710.htm

分享到:
评论

相关推荐

    ASP.NET 3.5高级程序设计(英文版,PDF)

    这本书的英文原名为"Pro ASP.NET 3.5 in C# 2008",采用C#语言作为编程示例,全面覆盖了ASP.NET 3.5的各种核心概念和技术。 ASP.NET是微软.NET框架的一部分,是一个用于构建Web应用程序的强大平台。在3.5版本中,...

    Beginning ASP.NET 3.5 in C# 2008

    《 Beginning ASP.NET 3.5 in C# 2008》是一本针对初学者的ASP.NET 3.5开发指南,它详细介绍了如何利用Microsoft的Visual Studio 2008 IDE来创建高效的Web应用程序。这本书是为那些对.NET Framework和C#编程有一定...

    C#2008和.net 3.5平台

    4. **ADO.NET Entity Framework**:这是一个新的ORM框架,它为开发人员提供了一种更高级别的数据访问抽象,使得开发人员可以更专注于业务逻辑而非底层数据访问细节。 #### 五、C#2008与.NET 3.5平台的结合 C#2008...

    Programming .net 3.5

    此外,O'Reilly还提供了其他与.NET相关的资源,如《ADO.NET 3.5 Cookbook》、《ADO.NET 3.5 in a Nutshell》等,帮助开发者解决特定问题。 通过ONDotnet.com,读者可以获取到独立的.NET编程和技术的最新资讯,而O'...

    Professional ASP.NET 3.5 SP1 In C# and VB

    在数据库集成方面,ASP.NET 3.5 SP1提供了ADO.NET Entity Framework,这是一种ORM(对象关系映射)工具,简化了与数据库交互的过程,使得开发者可以使用面向对象的方式来操作数据。同时,书中还会讲解如何使用SQL ...

    精通C#3.0与.net3.5高级编程 实例下载

    8. EF(Entity Framework):使用.NET 3.5中的ORM框架Entity Framework进行数据库操作的实例。 通过这些实例,读者不仅可以学习到C# 3.0和.NET 3.5的高级特性,还能掌握实际项目中可能遇到的问题和解决方案,提升...

    C#与.NET.3.5高级程序设计(第4版)].Pro.C#.2008.and.the.NET.3.5

    ### C#与.NET 3.5 高级程序设计:MVC 模型类与 LINQ to SQL 的应用 #### 知识点一:MVC 架构与模型类的作用 MVC(Model-View-Controller)架构模式是现代 Web 开发中广泛采用的一种软件架构模式,它将应用程序分为...

    在.NET 3.5 平台上使用LINQ to SQL创建三层多层Web应用系统-PDF文档

    此外,LINQ to SQL支持对象关系映射(ORM),自动将数据库表映射到C#类,减少了手动编写ADO.NET代码的需求。开发人员可以方便地创建、更新和删除数据库记录,就像操作普通C#对象一样。 在三层架构中,我们需要在...

    Beginning.ASP.NET.3.5.In.VB.2008从小工到专家

    - **Entity Framework**:虽然不是ASP.NET 3.5的一部分,但作为一种重要的ORM框架,对于理解数据访问策略非常有用。 ##### 7. 安全性 - **身份验证与授权**:ASP.NET提供了多种机制来实现用户的身份验证和授权,...

    Professional ASP 3.5 In C# and VB-3

    了解Entity Framework,它是.NET 3.5中的ORM(对象关系映射)工具,简化了数据库操作。 5. **LINQ(Language Integrated Query)**:介绍.NET 3.5中的新特性——集成查询语言,它允许开发者使用类似SQL的语法在代码...

    memcached For NET 3.5

    **压缩包子文件的文件名称列表:**"Memcached Providers 1.2 .NET 3.5" 暗示了这是一个版本为1.2的memcached提供者,专为.NET 3.5设计。"Providers"可能指的是多种不同的数据存储或服务提供方式,比如NHibernate、...

    DBEntry.Net 参考手册

    DbEntry.Net (Lephone Framework) is a lightweight, high performance ORM compnent for .Net 2.0 and 3.5. It has clearly and easily programing interface. It based on ADO.NET, and supported C#, Visual ...

    Metaprogramming in .NET [2013] [pdf + epub]

    .NET框架是微软开发的一种软件开发平台,它提供了丰富的类库和...在《Metaprogramming in .NET》这本书中,作者深入探讨了这些主题,旨在帮助开发者充分利用.NET框架的元编程能力,打造更高效、更灵活的软件解决方案。

    ASP.NET-[其他类别]南充人NET3.5LINQ操作数据库实例.zip

    LINQ to SQL 是一个轻量级的对象关系映射器,可以直接将数据库表映射为.NET类,而Entity Framework则是微软提供的一个更强大的ORM框架,支持更复杂的数据库操作和更灵活的数据模型设计。 在这个实例中,开发者可能...

    .NET MVC2介绍性文档

    - 相关书籍:《ASP.NET MVC in Action》、《Pro ASP.NET MVC Framework》和《ASP.NET 3.5 MVC架构与实战》。 通过以上介绍,我们可以看到ASP.NET MVC2是一个强大的Web应用开发框架,它提供了灵活的结构和清晰的代码...

    MVC学习之LINQ篇,linq in .NET4

    **LINQ(Language Integrated Query)**是一种在.NET Framework 3.5及更高版本中引入的强大功能,它允许开发人员以声明式的方式查询数据集合。LINQ的核心优势在于其能够提供一致的数据查询方式,无论数据源是内存中...

    ASP.NET从客户端中检测到有潜在危险的request.form值的3种解决方法

    问题原因:由于在asp.net中,Request提交时出现有html代码或javascript等字符串时,程序系统会认为其具有潜在危险的值。环境配置会报出“从客户端 中检测到有潜在危险的Request.Form值”这样的Error。 1、当前提交...

    LINQ体验系列(全解析)

    其中,LINQ to SQL是针对关系数据库的,它提供了一种对象关系映射(ORM)机制,使得开发者可以使用C#或VB.NET的对象模型来操作数据库,而无需编写大量的SQL语句。 LINQ to SQL的工作原理是将数据库表映射到类,将...

    ASP.NET MVC in Action

    - **NHibernate Integration:** One of the key aspects of the book is its focus on integrating persistence layers, specifically NHibernate, a popular object-relational mapping (ORM) tool for .NET....

Global site tag (gtag.js) - Google Analytics