浅谈Linq to Sql 的不足
这里我不讨论Linq的基本语法,也不讨论怎么用 Linq to Sql 来对数据库做SIUD操作,关于这方面的文章,网上已经有很多了。这里主要谈Linq to Sql的不足之处。
不足1:规则太死,可扩展性少
这里说的规则太死,主要指业务层实体与数据库表的绑定。基本上只能是一个实体对象对应于一个表,而且,对实体对象的要求太多,比如,(1)该实体对象必须要有默认无参构造方法(如果没有也会编译通过,但无法运行,因为Linq to Sql是通过反射来构造对象,而且用的是该对象的无参构造方法);(2)该实体的所有实体存储字段都不能有readonly关键字(反射要对该字段写值);(3)如果该实体存在对子对象(“一对多”关系的“多”一方的实体对象)的一个列表,则该列表必须是EntitySet<T>类型;(4)如果该实体有对父对象(“一对多”关系的“一”一方的实体对象)的引用,则该应用类型必须是EntityRef<T>类型,而且还要有相对于父对象主键这样的字段存在。所有这些规则,注定了业务层实体对象基本没有办法自己来手写以进行自定义,进行扩展。那有人说了,本来就没让你手写,有SqlMetal和可视化设计工具存在,还手写,吃饱了撑着。我同意这些工具确实非常有用,但是这些工具生成的实体满足我们业务的需要吗?因为业务的变化是多样的,而过多的条条框框却大大缚束了我们的手脚。
不足2:不支持TimeSpan
真是不可思议,实体类的TimeSpan字段怎么都没法直接映射到Sql Server的列中去(也许我没找对方法,若大家有办法,欢迎告知)。怎么办?难道要变通一下。是可以变通,而且变通的办法很多,但是,这种基本的类型都要变通才能实现,难道说这是一个足够成熟足够强大的框架所应该展现给大家看的吗?
不足3:透明性不够,使用上有困难
我在看书之前,曾写过这样的代码,如下:
using (ProgramConsoleDataContext db = new ProgramConsoleDataContext())
{
BaseTask baseTask = new BaseTask()
{
Name = "jhh",
};
db.BaseTasks.Attach(baseTask);
db.SubmitChanges();
}
结果运行失败,当然我现在知道为什么失败,但这也暴露了一个问题,就是使用者在使用Linq to Sql时,必须清楚DataContext对象的内部运作方式。看到Table<T>的“InsertOnSubmit”与“DeleteOnSubmit”这样的方法,就足以说明其封装性不够这样的问题。实际上,“InsertOnSubmit”原来设计的名字叫“Add”,“DeleteOnSubmit”原来的名字叫“Remove”,请问,你是喜欢后面的名字还是前面的名字,是喜欢后面的封装还是前面的封装?估计原来Linq to Sql设计团队的目标是提供一个封装性更强的框架,但后面因为种种原因没有实现,于是退而求其次,但怕大家误解“Add”与“Remove”这样方法,于是改成现在的名字,以强调“Submit”的概念(纯属个人猜测)。
DataContext所提供的实体变更跟踪功能是一大亮点,但使用上感觉不是很方便,也许是我没找到好的运用模式。我在想,我是该永久保存该对象的一个引用呢,还是用到一次建一次对象。如果采用第一种方法,那么我的程序将随着运行时间的增长而Load越来越多的数据,最后,可能整个数据库都在Load进来;那如果采用第二种方法,那么我怎么利用它提供的实体变更跟踪功能呢?当然,可以使用Table<T>的Attach方法,但我不是每次都知道UpdateMode的方式,而且,要是我要Attach的这个对象是个大对象呢,下面挂了很多的EntitySet呢,我又该怎么Attach?我思考了很久,没有找到答案。
不足4:性能问题
这个就不用说了,通过反射来实现的,当然有损失,也能接受,现在的ORM有不损失性能的吗?所以,这个可以说是问题,也可以说不是问题,大家都能理解。但是,DataContext的实体变更跟踪的实现,却又是以性能、空间来换取的。不信你试试,在DataContext中Retrieve一个实体,然后更改该实体,你看看你的实体构造方法被调用了几次?是不是两次?为什么?因为Retrieve时一次,更改该实体时又一次,因为DataContext保存了该实体的原始副本。本来,我听说,在实体中实现INotifyPropertyChanging与INotifyPropertyChanged这两个接口后,DataContext就能根据该接口提供的功能来进行实体变更跟踪,我想,这样就不会创建一个副本了吧,结果发现还是建了一个副本,这是为什么?不知道。
我还没有用Linq to Sql做过项目,因此以上的看法可能都不是很成熟。实际上,我想,Linq to Sql本来的定位就不是面向企业级运用的,我们也不要对它要求太多,实际上,简单就是它最大的美。我认为它适合于做一些比较简单的、业务逻辑不复杂的项目,但不适合做大的项目,我甚至认为中型的项目也不适合用它来做。目前Ado.net Entity Framework已经bate3了,期待它带来的Linq to entities能带给我们惊喜。
最后,提出一个疑问:ORM真的有大的前景吗?大规模的项目有用ORM的吗?什么时候会有成熟的面向对象的数据库产品,或者因为关系模型在数学上的优美性而永远不会有呢?
转载于:https://www.cnblogs.com/jhh0111/archive/2008/07/01/1233350.html
浅谈Linq to Sql 的不足相关推荐
- 浅谈LINQ to SQL集成数据库语言优劣
Linq To SQL是Microsoft开发的针对解决data!=object问题的新技术.在笔者的一系列的文章中,对它已经做了大量的介绍.现在,笔者将从经验的角度,谈谈它的优劣. 1.LINQ t ...
- 浅谈Linq to SQL中的模式
学习Linq to SQL也有一段时间了,感叹它做为ORM虽然简单但是功能效率都还不错,从编译器和语言层面支持上来看,它是其他ORM工具不能比的.Linq to SQL中运用了很多模式对自身的效率进行 ...
- boolean mybatis_浅谈mybatis中SQL语句给boolean类型赋值问题
我就废话不多说了,大家还是直接看代码吧~ SELECT m.menu_id , m.parent_id , m.`name` , 1 opens FROM menu m WHERE m.is_vali ...
- sql的四种连接 用mysql的语句写_170221、浅谈mysql的SQL的四种连接
例子: ------------------------------------------------- a表 id name b表 id job parent_ ...
- mysql sql优化_浅谈mysql中sql优化
说到sql优化,一般有几个步骤呢,在网上看到了一篇很不错的帖子.在这分享一下吧,也是自己学习的一个过程. 一.查找慢查询 1.1.查看SQL执行频率 SHOW STATUS LIKE 'Com_%'; ...
- ERP浅谈之报表SQL简述
昨天刚刚独立完成了一次月销售增长分析报表,发现了很多问题和方法,觉得很有必要来记录一下. 首先贴一下代码: /*dialect*/ select Fnumber,FName_l2,sum(NowFQt ...
- Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的差别
在上面一篇文章Linq To Sql进阶系列(六)中,我们提到了使用object的动态查询.本文在上文的基础上,再做更加深入的引申.同时修正上文中一些不妥的地方. 1, object的动态查询续 首先 ...
- 浅谈SQL注入风险 - 一个Login拿下Server(转)
前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:"老师你这SQL有注 ...
- 浅谈SQL Server内部运行机制
原文:浅谈SQL Server内部运行机制 对于已经很熟悉T-SQL的读者,或者对于较专业的DBA来说,逻辑的增删改查,或者较复杂的SQL语句,都是非常简单的,不存在任何挑战,不值得一提,那么,SQL ...
最新文章
- 工作流笔记第一天_简单介绍activiti
- 惠普z840工作站linux,HP Z840 工作站,高清非编工作站
- Javaweb编程中的乱码问题
- Reuse library debug in Chrome - phase2 handle success response (2)
- Jexus支持HTTPS协议
- css 文字重叠_html网页文字重叠 字体叠加显示css如何解决
- 嘉峪关计算机网络优化,嘉峪关广播电视大学计算机网络技术专业_甘肃报名_网络教育计算机网络技术专业教学计划_中国教育在线...
- WPF 之 鼠标双击事件
- 【算法笔记】数论基础:康托展开(全排列和序号之间的映射)
- [索引汇总帖] 【eoeAndroid社区索引】Cocos2d-x部分汇总 [转贴]
- Java实现进制转换方法汇总
- html吃豆豆小游戏源码,HTML5 Canvas吃豆豆动画
- 风变编程python课_聊一聊风变编程Python线上课程
- [转] Redefining the shading languages ecosystem with SPIR-V
- 自己制作Chrome便携版实现多版本共存
- js如何截取某个字符串前面所有的字符串
- 推荐一个单干网赚好站!BUXJOB - 生活至上,美容至尚!
- NodeJs股票查询应用
- 高内聚 松耦合 高扇入 低扇出
- 手把手教你开发第一个HarmonyOS (鸿蒙)移动应用