《深入了解 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 (数据内容) --这里需要 ...
随机推荐
- linux编译安装MySQL
最近就想搞搞hadoop,然后装个MySQL,测试一下那个sqoop. MySQL这种东西,既然是开放源码的,那就源码安装吧. 下面是我的测试环境说明: VMware10+Ubuntu14.04 Ky ...
- 第二篇 :微信公众平台开发实战Java版之开启开发者模式,接入微信公众平台开发
第一部分:微信公众号对接的基本介绍 一.填写服务器配置信息的介绍 登录微信公众平台官网后,进入到公众平台后台管理页面. 选择 公众号基本设置->基本配置 ,点击“修改配置”按钮,填写服务器地址( ...
- 精----Java读取xml文件的四种方法
xml文件: Xml代码 <?xml version="1.0" encoding="GB2312"?> <RESULT> <VA ...
- VMware + OpenStack: 从 Plugin 到 VIO (VMware Integrated OpenStack)的演进
VMware 做为实际上的企业虚拟化领导者,对 OpenStack 的态度一直在变化.一开始,VMware 表达出与 OpenStack 的竞争态度.随着 OpenStack 的逐步壮大并且一步一步进 ...
- 《致命接触》:人畜共患传染病的故事,SARS一章非常精彩,四星推荐
讲人畜共患的传染病的故事:亨德拉.埃博拉.疟疾.SARS.Q热.鹦鹉热.莱姆病.艾滋病等.作者比较会讲故事,又熟悉病毒传播相关的各种学科的知识(病毒学.生态学,还有一些我没记住的相关小学科),能把相关 ...
- 【转】C语言位运算符:与、或、异或、取反、左移与右移详细介绍
转载自:http://www.jb51.net/article/40559.htm,感谢原作者. 以下是对C语言中的位运算符:与.或.异或.取反.左移与右移进行了详细的分析介绍,需要的朋友可以过来参考 ...
- java使用HttpURLConnection和HttpClient分别模拟get和post请求以及操作cookies
1.使用HttpURLConnection public static String getJsonByURL(String base_url) { String url = base_url; St ...
- 孙鑫视频学习:对第10章设置线宽时为什么不调用UpDateData(TRUE)的理解
在第10章10.2.1小节中,首先分别对视图类和对话框类添加了一个名为m_nLineWidth的int型变量,再将用户在CSetting dlg对话框的edit控件中输入的线宽值记录在dlg.m_nL ...
- 运维工作中sed常规操作命令梳理
sed是一个流编辑器(stream editor),一个非交互式的行编辑器.它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间",接着用sed命令处理缓冲 ...
- 16Spring_AOP编程(AspectJ)_最终通知