《深入了解 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 (数据内容) --这里需要 ...
随机推荐
- php 修改上传文件大小 (max_execution_time post_max_size)
有些朋友要通过自己的网站后台,包括论坛,来上传一些文件,php一般为2m,或8m(以下我们按默认为2m),接下来就是来讲怎么修改上传文件大小的. 1.首先修改执行上传文件限制 一般的文件上传,除非文件 ...
- HTML5不支持标签和新增标签
1.HTML5不支持或不赞成使用的标签 <acronym>——定义只取首字母的缩写,HTML5 不支持.使用<abbr>定义缩写代替,其中title 属性可用于在鼠标指针移动到 ...
- iOS开发-简单解析JSON数据
什么是JSON JSON是一种轻量级的数据格式,一般用于数据交互 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外) JSON的格式很像OC中的字典和数组 {“nam ...
- sublime学习
1:goto anything 特性 快捷键 ctrl + P @ : # 使用 2:多行游标功能 快捷键 ctrl + D ctrl + K 跳过选择 alt + F3 多选 产生 ...
- 【C#】C# 实现发送手机短信
现在很多网站都是短信发送的功能,怎么实现的呢.对于个人站长来说的话,通过使用SMS短信通API接口相对比较划算和简单.那怎么实现呢,步骤如下: 1. 从网上(http://sms.webchinese ...
- 深搜+回溯 POJ 2676 Sudoku
POJ 2676 Sudoku Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 17627 Accepted: 8538 ...
- 怎么运用ZBrush中的Z球制作身体部分
本文主要讲解利用ZSphere[Z球]创建人体的大体轮廓,这是ZBrush®软件制作模型的第一步,这一阶段中我们需要反复调节人体比例结构,为以后深入制作打下基础,具体制作过程如下. 查看更多内容请直接 ...
- uGUI练习(五) Draggable Object
练习目标 学习制作一个可拖动的UI 一.步骤 监听UI的Drag事件,需要我们写一点点的代码. 1.创建一个Panel ,设置size为(100,100) 2.创建DraggableObjectSce ...
- java 为啥变量名前要加个m?
用m_开头表示类的成员变量,member的意思如果是全局变量,则由g_开头还有常量c_开头 静态变量s_开头
- PPP(点对点协议(Point to Point Protocol)
1.简介PPP(点到点协议)是为在同等单元之间传输数据包这样的简单链路设计的链路层协议.这种链路提供全双工操作,并按照顺序传递数据包.设计目的主要是用来通过拨号或专线方式建立点对点连接发送数据,使其成 ...