当前位置:编程学习 > C#/ASP.NET >>

关于ORM。。送分了。

本人小菜,看了很多关于ORM,似懂非懂。问一句。
 ORM  是不是一个工具,还是指一类工具? 通俗点说,是不是 用来生成代码的,就是把数据库里面的数据,自动生成DAL ? 
  像 动软 什么的能不能就说它是ORM ,还是应该怎么表达他们之间的关系?
  
   --------------------编程问答-------------------- 简单地说...现在流行的数据库是平面的,程序流行立体的...很多时候需要个转换方法,ORM就是...

ORM是个概念,与代码无关,更不是工具...只能说有些工具实现ORM,有些工具打着ORM的旗号行骗... --------------------编程问答-------------------- orm 映射!  --------------------编程问答-------------------- 物件关联对映(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种用于实现从物件资料到关联资料的存储映射的程式设计技术。
--------------------编程问答-------------------- 对象关系映射....在java里多用到.....
对象指:实体
关系指:hibernate 的配置
映射指:形成对应的关系... --------------------编程问答-------------------- 简单说,“O”的意思就是要直接处理.net对象,而数据库是关系数据库。 --------------------编程问答-------------------- --------------------编程问答-------------------- 举个例子:

using(var transaction= myDAL.GetInstance())
{
    var dd= DateTime.Parse("2009/1/1");
    (from Department d in transaction
        where d.Name=="技术部"
        join User u in transaction on d equals u.Dep
        where u.入职时间<dd
        select u)
        .ToList()
        .ForEach(u=>{ u.工资 += 1000; });
    transaction.CommitChanges();
}        


这里,就是使用面向对象的方式,来查询出所有符合条件的User(注意,包括实例为User的子类对象),然后更新并保存到关系数据库。 --------------------编程问答-------------------- ORM 不是一个工具,是一类工具。代码工作者使用内存中的对象实现业务逻辑,产生的结果,也就是业务数据必须要持久的保存,以备后用。当前通用的保存方法就是将它们放入关系型数据库。但是在实践中,代码工作者将内存对象保存到数据库时,或者反之,从数据库还原内存对象时,会花费大量的时间和精力。没完没了的书写和调试sql语句是干巴且乏味的工作。这个现象叫做阻抗失协。阻抗失协本质上是由于内存对象和关系数据库对数据的理解方式不同造成的---内存对象之间依赖指针保持彼此间的关系,而关系数据库则使用外键。于是便有人想到 ORM 的点子,O指的是内存对象,Object,R指的是关系数据库,Relational DB,M的解释比较色情,映射,Mapping。ORM的目标就是消除阻抗失协,解放代码工作者。ORM 是非常难实现的,因为问题太多。java界最著名的ORM是 hibernate,.net里有 nhibernate, 微软最近几年才推出自己的 ORM, entity framework。但是ORM在现实世界的效果怎么样呢?答案是不怎么样。比如说 nhibernate,十分难学,不是他做的不好,是真的难学。结果很多人把它封装一下,弄成 Active Record 来用,完全失掉了ORM的意义,还不如代码生成器来的痛快直接。不过话说回来,代码工作者是解放不了的,一解放就失业了。 --------------------编程问答-------------------- ORM---Object Relation Mapping --------------------编程问答-------------------- ORM是一种技术。在ORM出现之前,应用程序访问数据库一般通过SQL语句、储存过程等实现。但是有了ORM后,程序员能将更多经历放在业务逻辑上,不用过SQL语句、储存过程去操作数据库了。它最核心的思想是将数据库中的表与实体类建立映射关系,通过操作实体类来操作数据库。现在ORM框架有NHIBERNATE,Linq to sql、 Entity Framework等等 --------------------编程问答-------------------- 举个例子,再来看你的问题就比较清楚了

引用楼主 zengxin0308 的回复:
 ORM  是不是一个工具,还是指一类工具? 通俗点说,是不是 用来生成代码的,就是把数据库里面的数据,自动生成DAL ? 
  像 动软 什么的能不能就说它是ORM ,还是应该怎么表达他们之间的关系?


ORM这个概念其实是20年前面向对象技术刚刚流行的时候就出现的,是一种比较概括性的技术描述,并不具体指哪一个厂家的软件。当然,具体厂家也完全可以说自己开发的是ORM。就好象我们说“我去买鞋”,其实你不可能把世界所有款式的鞋都买一双。所以我们如果正常而自然地说话,总是不像数学那么严格的。所以假设一个厂家说他开发了一个ORM,我们就知道他开发了一个产品,而不是说只有他的东西才是ORM别人的就一定不是。

至于你说的“生成代码的”是不是,自己判断吧!上面我在例子中写了,特别要注意,保存数据很容易,而关键技术就是“查询语句如何用面向对象的方式来书写”的技术。 --------------------编程问答-------------------- --------------------编程问答-------------------- O指的是内存对象,Object,R指的是关系数据库,Relational DB,M的解释比较色情,映射,Mapping。 --------------------编程问答--------------------   Linq to Sql 就是一种ORM实现 --------------------编程问答-------------------- 实际上,有一些技术会区分出深浅不同。

比如User类型的对象,我们的系统中会扩展User类型而定义子类,甚至子类的子类。那么一种ORM产品它能处理继承了的对象么。比如我上面举例的查询,它能不能查询出不仅仅是作为User对象实例,而且也包括作为“Teacher”对象实例?因为Teacher就是从User继承的,所以上面的查询按OO的道理说应该作为User查询出来。

进一步地,假设User类仅仅其实是interface呢?能不能查询?

另一方面,其查询方法越是接近于sql越好,要是像linq这样被vs支持、可以智能感知给出帮助更好。


只是所谓“自动生成代码”的ORM,我反正是瞧不上那类工具。 --------------------编程问答-------------------- 要是像linq这样被vs支持  -->  要是其支持linq provider从而被vs支持 --------------------编程问答-------------------- linq to sql还是一种比较简单的ORM工具。 --------------------编程问答-------------------- 推荐楼主使用最简单的ORM框架:

PDF.NET 数据处理框架
•类似LINQ的支持ORM实体类查询的OQL表达式(有了LINQ为啥还要搞一个OQL?本框架OQL的基本设计在LINQ或者说本人知道 LINQ之前,另外,.NET3.5框架才正式支持LINQ,而我们公司的一个产品却因为采用了3.5框架安装部署不方便成为市场和客服常常抱怨的理由。未来还有这样的理由,我们迫切需要一个类似LINQ的东西运行在某些客户过时的机器上。 )
•无需任何后台代码即可分页的增强数据分页控件。
•只需要一行代码实现页面数据的增,删,改,查。
•基于SQL词法分析的支持多种数据库的高效分页类,你只需要设置SQL语句和分页属性它便能够为你生成特定数据库平台的当前页数据的SQL语句。
•整个框架没有使用反射 来实现ORM和界面数据绑定,可以保证数据操作的高效率。 
•一套实用工具,可以生成实体类和根据SQL配置文件自动生成代码的代码生成器以及SQL配置文件管理程序
--------------------编程问答-------------------- linq to sql最大的瑕疵,就是其思路是面向关系数据库的。

真正好用的ORM,应该从实体类自动生成数据库结构,并且当你修改实体类定义时它也能自动修改数据库定义。比如我为User增加了一个field——会费,那么数据库中原来没有会费的所有user也就被系统自动填上会费的默认值。所以我们编程时经常增加和删除field并不算什么,系统完全可以有一个机制在运行时自动升级数据库定义。

linq to sql则是本末倒置的,它要你维护一大堆跟OO没有关系的所谓配置信息,稍有不慎就乱了。 --------------------编程问答-------------------- 还有,我第一次看到linq to sql使用property而不是field来对应数据库中的值时,我吓了一跳。.net对象中,field才是保存原始值的,而peoperty表达各种将基础的数据需要重新计算的方法。怎么能用peoperty,而不是field,来对应数据库中的值呢?真不知道linq to sql的设计师是怎么想的。


我这里接着评点linq to sql的几点瑕疵,目的是说明一下ORM的一些技术要求。 --------------------编程问答--------------------
P哥解释的真详细 --------------------编程问答-------------------- 用 property 而不是 field 我觉得没有什么问题,只要这个 property 是同时可读可写的,值的正确性由程序员保证,他们的想法可能有两个,一个是与序列化语义保持一致, Serialzable 可以用在 property 上,但不能用在field 上,另一个可能是便于让实体实现“自我跟踪”,在写属性属性的时候做一下 dirty 标记。用作 ORM 中的 O 时,由于语境非常明显,所以除了封装 field,property 不太可能干杀人放火的坏事 --------------------编程问答-------------------- --------------------编程问答-------------------- ORM就是指对象关系映射,object,rationanl ,mapping,是一个设计模式,不是工具,也不是语言 --------------------编程问答-------------------- LINQ to SQL用 property 而不是 field 的问题
===================
貌似数据绑定控件只会绑定对象的属性,而不是字段,会不会跟这个有关? --------------------编程问答-------------------- 学习下~~ --------------------编程问答-------------------- 可以看一下CYQ.Data这款数据框架,里面有原理解说和开源版本源码:http://www.cyqdata.com/cyqdata --------------------编程问答-------------------- ORM,就是对象到关系数据库的映射,在操作数据库时动态生成SQL语句,完成对数据库的操作!
说白就是对象到Sql语句的映射,数据库查询结果到对象的映射。

--------------------编程问答--------------------
引用 16 楼 sp1234 的回复:
要是像linq这样被vs支持 --> 要是其支持linq provider从而被vs支持

就是因为有了linq to sql,程序员要在代码中写类似sql语句的东西;其语法与C#完全不着边,使用与真实sql语句又有区别,效率还很低,可以说就是一块鸡肋。

引用 15 楼 sp1234 的回复:
只是所谓“自动生成代码”的ORM,我反正是瞧不上那类工具。

不要忘了vs也就一工具而已,泛型也就是用来生成代码的。
对于写程序的来说,好的工具就可以帮我生成高效易维护的“垃圾代码”,从而使写代码的人基本只关注业务逻辑。 --------------------编程问答-------------------- linq除了linq to sql,其它的都很好用。 --------------------编程问答--------------------
引用 1 楼 vrhero 的回复:
简单地说...现在流行的数据库是平面的,程序流行立体的...很多时候需要个转换方法,ORM就是...
ORM是个概念,与代码无关,更不是工具...只能说有些工具实现ORM,有些工具打着ORM的旗号行骗...

大虾都说了,估计是吧. --------------------编程问答--------------------
引用 19 楼 sp1234 的回复:
linq to sql最大的瑕疵,就是其思路是面向关系数据库的。

真正好用的ORM,应该从实体类自动生成数据库结构,并且当你修改实体类定义时它也能自动修改数据库定义。比如我为User增加了一个field——会费,那么数据库中原来没有会费的所有user也就被系统自动填上会费的默认值。所以我们编程时经常增加和删除field并不算什么,系统完全可以有一个机制在运行时自动升级数据库定义。

li……

这个不是瑕疵,就是个错误!
不自己写工具,vs不会帮你实现这些的(最少现在还没有)。 --------------------编程问答-------------------- 所以我从稍微了解到linq2sql就觉得它是个打着ORM旗号行骗的家伙,就没打算再在它上面多花一分钟...结果证明我的确节约了很多时间... --------------------编程问答--------------------
引用 29 楼 sbwwkmyd 的回复:
泛型也就是用来生成代码的。

这个说法不确切,说明一下。
C++的模板是编译时的,就是用来生成代码的。
C#的泛型是运行时的,其目的也就为了少写“垃圾代码”而存在的。
我们需要看到编程工具的本质,如果不能少写代码,如果不能更易维护,如果做不到高效执行(其实次要一点的),那为什么使用工具呢? --------------------编程问答--------------------
引用 19 楼 sp1234 的回复:
linq to sql最大的瑕疵,就是其思路是面向关系数据库的。

真正好用的ORM,应该从实体类自动生成数据库结构,并且当你修改实体类定义时它也能自动修改数据库定义。比如我为User增加了一个field——会费,那么数据库中原来没有会费的所有user也就被系统自动填上会费的默认值。所以我们编程时经常增加和删除field并不算什么,系统完全可以有一个机制在运行时自动升级数据库定义。

l……

现在大部分都是面向数据库的,有些可以直接生成数据库,但不能自动修改。
--------------------编程问答-------------------- --------------------编程问答--------------------
引用 3 楼 zx75991 的回复:
物件关联对映(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种用于实现从物件资料到关联资料的存储映射的程式设计技术。


ssh 中的Hibernate就是典型
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,