《深入了解 Linq to SQL》之对象的增删改 —— 麦叔叔呕心呖血之作
你的程序里,是否到处充斥着这种代码:
db.Customers.InsertOnSubmit(customer);
db.SubmitChange();
如果某一天,因为 Customers 表的数据库巨增,需要把它拆成两个表,你是否会胆寒???当然,对于查询,我们可以通过视图来解决。对于插入,或者更新呢?据说,现在的数据库在某些情况下,可以对视图进行数据的更新、插入。但是我们要考虑的是不可以的情况。是不是得每个地方都改呀?对于一个大型的项目,这种改动是很可怕的,某个地方少改了,就糟糕了。不过,对于这种情况,Linq to SQL早已经为我们想好了应对的方案。实现 DataContext 继承类中的 InsertCustomer(Customer customer) 方法就可以了,如下图所示。
实现方法的伪代码:
partial void InsertCustomer(Customer instance)
{
//往表1插入数据
//往表2插入数据
}
当实现了 InsertCustomer 这个方法,Linq to SQL 再往 Customers 这个表插入数据时,将会调用该方法来插入数据,而不是默认的方式。
稍微注意一下,我们发现还有 UpdateCustomer,DeleteCustomer 这两个方法,估计你们也能猜到它们的用途了,没错,就是用来替换掉默认的更新、删除方法。
我们现在接着来考虑一个问题,Linq to SQL 是如何得知 InsertCustomer、UpdateCustomer 和 DeleteCustomer 这几个方法已经实现了呢?通过反射。那我们现在大慨可以得知,Linq to SQL 在插入、更新、删除数据是这么一个过程:
先通过反射,看是否存在 InsertCustomer、UpdateCustomer、DeleteCustomer 这些方法是否存在,如果存在,则调用这些方法,否则采用默认的方法进行增删改。但是,这样会有一个问题,如果插入10条数据,则需要调用反射方法10次,这未免有点笨,众所周知,反射是比较耗性能,而且,这是不必要的性能损失。所以 Linq to SQL 在通过反射把那几个方法找出来后,缓存起来,重复使用。那么,这几个方法是缓存在哪里呢?
在 MetaTable 这个类里面,我们可以看到 InsertMethod、 UpdateMethod 和 DeleteMethod 这三个属性。没错,增删改的扩展方法,就是缓存这里。
我们现在再来理清一下这个流程:
1、在创建 DataContext 的时候,会创建一个影射源(MappingSource)。该影射源会针对每个类,创建一个元表(MetaTable),用来描述表与实体之间的影射。在创建这个元表的时候,通过反射,检查 DataContext 是否有对应实体类的增删改的扩展方法,如果有,则为 InsertMethod、UpdateMethod、DeleteMethod 这三个属性相应地赋值。
2、在插入一条数的时候的时候,先把该实体类对应的元表找出来,看该元表的 Insert 属性是否为空(null),如果为空,则调用默认的插入方法,该方法等价于 DataContext 类中的 ExecuteDynamicInsert 方法。
Linq to SQL 对数据增删改的流程,就是这么个样。
《深入了解 Linq to SQL》之对象的增删改 —— 麦叔叔呕心呖血之作的更多相关文章
- 《深入了解 Linq to SQL》之对象的标识 —— 麦叔叔呕心呖血之作
序言 很多朋友都向我提过,希望我写一下关于Linq to SQL 或者 VS 插件方面的文章.尽管市面上有很多 Linq to SQL 的书籍,但是都是介绍怎么用,缺乏深度.关于 VS 插件方面的书籍 ...
- hibernate关联对象的增删改查------查
本篇博客是之前博客hibernate关联对象的增删改查------查 的后继,本篇代码的设定都在前文已经写好,因此读这篇之前,请先移步上一篇博客 //代码片5 SessionFactory sessi ...
- Python之实例对象的增删改查
#实例对象的增删改查p1 = ChinesePeople('wangyue')#print (p1.__dict__) #查看实例对象的属性#print (p1.name)(p1.play_ball( ...
- SQL语法之初级增删改查
SQL语法之初级增删改查 1.增 1.1插入单行 INSERT INTO [表名](列名) VALUES(列值) 语法如下: INSERT INTO bsp_Nproductclass(guid,pi ...
- linq的创建 和 数据的增删改查
1.linq创建之前,一定要在sql做好数据表的主外键关系. 2.linq文件是以.dbml结尾,一般一个数据库的名字就是一个linq的名字 3,以实例来演示增删改查 数据库的名字为linq,里面有两 ...
- VS连接SQL Server数据库,增删改查详细教程(C#代码)_转载
工具: 1.Visual Studio (我使用的是vs2013) 2.SQL Server (我使用的是sql server2008) 操作: 1.打开SQL Server,打开后会看到数据库的初 ...
- Hibernate进行对象的增删改查
首先我们看看hibernate手动配置步骤 (这个了解一点就可以了,以后是不会自己全部手动配置的) 1. 创建WEB项目 2 下载hibernate-release-4.3.11.F ...
- SQL学习之简单增删改查
SQL最常用的语句,就是增删改查: 增删改查的对象,分别是库(文件夹),表(文件),表的内容(表的记录): 一.创建一个基本的表 #create table Student_Info (Name VA ...
- Sql Server——数据的增删改
所谓数据的增删改就是在创建好数据库和表后向表中添加数据.删除表中的数据.更改表中的一些数据. 新增数据: 语法一: insert into 表名 values (数据内容) --这里需要 ...
随机推荐
- 如何通过js实现图片预览功能
一.效果预览 效果图: 二.实现代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &quo ...
- [转]Try Cloud Messaging for Android
本文转自:https://developers.google.com/cloud-messaging/android/start
- [转]IOS上路_01-Win7+VMWare9+MacOSX10.8+XCode4.6.3
本文转自:http://my.oschina.net/vigiles/blog/141689 目录[-] 1. 资源准备: 1)实体机: 2)VMWare9: 3)VM for MacOS 补丁: 4 ...
- NOIP2008 普及组T1 ISBN号码 解题报告-S.B.S.
题目描述 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字.1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”就是分隔符(键盘上的减号),最后一 ...
- 最小生成树 2429: [HAOI2006]聪明的猴子
BZOJ 2429: [HAOI2006]聪明的猴子 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 877 Solved: 566[Submit][ ...
- "德意志之歌"的历史
1841年8月, 词作家奥古斯特在当时属于英国的黑尔格兰岛上度假时, 创作了"德意志之歌"的歌词.9月, 这首歌首次出版发行, 曲调则借用了海顿的一首君主颂歌 - "皇帝 ...
- HDU 5044 Tree --树链剖分
题意:给一棵树,两种操作: ADD1: 给u-v路径上所有点加上值k, ADD2:给u-v路径上所有边加上k,初始值都为0,问最后每个点和每条边的值,输出. 解法:树链剖分可做,剖出来如果直接用线段树 ...
- Mango DS Traning #49 ---线段树3 解题手记
Training address: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=38994#overview B.Xenia and B ...
- RabbitMQ 一二事 - 简单队列使用
消息队列目前流行的有三种 1. RabbitMQ 2. ActiveMQ 3. Kafka 这三种都非常强大,RabbitMQ目前用的比较多,也比较流行,阿里也在用 ActiveMQ是阿帕奇出品,但是 ...
- java 16 -4 LinkedList的特有功能
了解 LinkedList的特有功能: A:添加功能 public void addFirst(Object e) public void addLast(Object e) B:获取功能 publi ...