你的程序里,是否到处充斥着这种代码:

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》之对象的增删改 —— 麦叔叔呕心呖血之作的更多相关文章

  1. 《深入了解 Linq to SQL》之对象的标识 —— 麦叔叔呕心呖血之作

    序言 很多朋友都向我提过,希望我写一下关于Linq to SQL 或者 VS 插件方面的文章.尽管市面上有很多 Linq to SQL 的书籍,但是都是介绍怎么用,缺乏深度.关于 VS 插件方面的书籍 ...

  2. hibernate关联对象的增删改查------查

    本篇博客是之前博客hibernate关联对象的增删改查------查 的后继,本篇代码的设定都在前文已经写好,因此读这篇之前,请先移步上一篇博客 //代码片5 SessionFactory sessi ...

  3. Python之实例对象的增删改查

    #实例对象的增删改查p1 = ChinesePeople('wangyue')#print (p1.__dict__) #查看实例对象的属性#print (p1.name)(p1.play_ball( ...

  4. SQL语法之初级增删改查

    SQL语法之初级增删改查 1.增 1.1插入单行 INSERT INTO [表名](列名) VALUES(列值) 语法如下: INSERT INTO bsp_Nproductclass(guid,pi ...

  5. linq的创建 和 数据的增删改查

    1.linq创建之前,一定要在sql做好数据表的主外键关系. 2.linq文件是以.dbml结尾,一般一个数据库的名字就是一个linq的名字 3,以实例来演示增删改查 数据库的名字为linq,里面有两 ...

  6. VS连接SQL Server数据库,增删改查详细教程(C#代码)_转载

    工具: 1.Visual Studio (我使用的是vs2013) 2.SQL Server  (我使用的是sql server2008) 操作: 1.打开SQL Server,打开后会看到数据库的初 ...

  7. Hibernate进行对象的增删改查

    首先我们看看hibernate手动配置步骤 (这个了解一点就可以了,以后是不会自己全部手动配置的) 1.    创建WEB项目 2       下载hibernate-release-4.3.11.F ...

  8. SQL学习之简单增删改查

    SQL最常用的语句,就是增删改查: 增删改查的对象,分别是库(文件夹),表(文件),表的内容(表的记录): 一.创建一个基本的表 #create table Student_Info (Name VA ...

  9. Sql Server——数据的增删改

    所谓数据的增删改就是在创建好数据库和表后向表中添加数据.删除表中的数据.更改表中的一些数据. 新增数据: 语法一: insert into 表名 values (数据内容)        --这里需要 ...

随机推荐

  1. php 修改上传文件大小 (max_execution_time post_max_size)

    有些朋友要通过自己的网站后台,包括论坛,来上传一些文件,php一般为2m,或8m(以下我们按默认为2m),接下来就是来讲怎么修改上传文件大小的. 1.首先修改执行上传文件限制 一般的文件上传,除非文件 ...

  2. HTML5不支持标签和新增标签

    1.HTML5不支持或不赞成使用的标签 <acronym>——定义只取首字母的缩写,HTML5 不支持.使用<abbr>定义缩写代替,其中title 属性可用于在鼠标指针移动到 ...

  3. iOS开发-简单解析JSON数据

    什么是JSON   JSON是一种轻量级的数据格式,一般用于数据交互 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外) JSON的格式很像OC中的字典和数组   {“nam ...

  4. sublime学习

    1:goto anything 特性 快捷键  ctrl + P    @  : # 使用 2:多行游标功能 快捷键 ctrl + D     ctrl + K 跳过选择 alt + F3 多选 产生 ...

  5. 【C#】C# 实现发送手机短信

    现在很多网站都是短信发送的功能,怎么实现的呢.对于个人站长来说的话,通过使用SMS短信通API接口相对比较划算和简单.那怎么实现呢,步骤如下: 1. 从网上(http://sms.webchinese ...

  6. 深搜+回溯 POJ 2676 Sudoku

    POJ 2676 Sudoku Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 17627   Accepted: 8538 ...

  7. 怎么运用ZBrush中的Z球制作身体部分

    本文主要讲解利用ZSphere[Z球]创建人体的大体轮廓,这是ZBrush®软件制作模型的第一步,这一阶段中我们需要反复调节人体比例结构,为以后深入制作打下基础,具体制作过程如下. 查看更多内容请直接 ...

  8. uGUI练习(五) Draggable Object

    练习目标 学习制作一个可拖动的UI 一.步骤 监听UI的Drag事件,需要我们写一点点的代码. 1.创建一个Panel ,设置size为(100,100) 2.创建DraggableObjectSce ...

  9. java 为啥变量名前要加个m?

    用m_开头表示类的成员变量,member的意思如果是全局变量,则由g_开头还有常量c_开头 静态变量s_开头

  10. PPP(点对点协议(Point to Point Protocol)

    1.简介PPP(点到点协议)是为在同等单元之间传输数据包这样的简单链路设计的链路层协议.这种链路提供全双工操作,并按照顺序传递数据包.设计目的主要是用来通过拨号或专线方式建立点对点连接发送数据,使其成 ...