走进Linq-Linq to SQL源代码赏析之Provider的初始化

话说Linq to SQL理论上应该支持多种数据库的,而且应该支持多种数据库, 到最后却落的这个局面,是为了商业考虑还是本来技术就不成熟?不得而知。不 过不管怎么说Linq to SQL的体系结构确实是支持扩展的。

在 System.Data.Linq.Mapping这个命名空间下微软提供了一个特性: ProviderAttribute,使用强类型的DataContext或使用Xml做映射的时候,该特 性可以用来指定具体的数据库提供者。如下:

[Database(“dbo.cnblogs”)]
[Provider(typeof(SqlProvider))]
Public CnBlogDataContext : DataContext
{

}

这就 表明我们的Linq to SQL是基于Sql Server数据库了,SqlProvider是实现了 IProvider接口的(该接口存在于System.Data.Linq.Provider命名空间下)。

在DataContext初始化时执行的Init方法里有这样几行代码:

if (model.ProviderType == null)    {        throw Error.ProviderTypeNull();    }    Type providerType = model.ProviderType;    if (!typeof(IProvider).IsAssignableFrom(providerType))    {        throw Error.ProviderDoesNotImplementRequiredInterface(providerType,typeof(IProvider));    }    this.provider = (IProvider) Activator.CreateInstance(providerType);this.provider.Initialize(this.services, connection);

这里是根据model的ProviderType 创建一个IProvider的实例。Model就是一个MetaModel对象。前面两篇都提到了 MetaModel有两个子类,AttributeMetaModel和XmlMetaModel,看看你是用哪种 方法做映射的,我们这里就用AttributeMetaModel做例子,在 AttributeMetaModel的构造函数里有这样几行代码:

ProviderAttribute[] customAttributes = (ProviderAttribute[]) this.contextType.GetCustomAttributes(typeof(ProviderAttribute), true);        if ((customAttributes != null) && (customAttributes.Length == 1))        {            this.providerType = customAttributes[0].Type;        }        else        {            this.providerType = typeof(SqlProvider);        }

从DataContext类上找Provider 特性,如果没有找到就默认使用SqlProvider了。创建了IProvider的实例就会调 用它的Initialize方法进行初始化。Initialize方法需要两个参数IDataService 和一个连接对象(DbConnection或是连接字符串)。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索typeof
, this
provider
linq provider、linq to sql provider、provider、wmi provider host、contentprovider,以便于您获取更多的相关知识。

时间: 2024-08-31 18:08:47

走进Linq-Linq to SQL源代码赏析之Provider的初始化的相关文章

走进Linq-Linq to SQL源代码赏析,通过Linq to SQL看Linq

LINQ,语言集成查询,就是把一些查询操作集成到语言中(貌似是废话),比 如查询关系数据库,而且提供一种一致的操作方式,不管最终的数据存储在哪里 ?内存中,远程数据库还是一Xml格式文件存储,不仅仅如此,你还可以用你丰 富的想象力扩充自己的查询.Linq to SQL无疑把Linq的能量发挥的淋漓尽致, 我们就以Linq to SQL的体系结构来学习一下Linq的整体框架. 在上两章 里面我们通过源代码探讨了关于DataContext的初始化和Table<TEntity> 对象的获取,以及Pr

走进Linq-Linq to SQL源代码赏析 Table的获取过程

上一篇我们看到了DataContext是如何初始化的,它需要一个连接对象,还需 要一个MappingSource做映射的配置. 在DataContext中我们打交道最多 的也许就是GetTable<TEntity>()方法了,这个方法会获取一个 Table<TEntity>对象,今天我们就来看看这个对象是如何获取的. 对于获取Table<TEntity>对象我们还要看看这个DataContext是不 是强类型的,关于强类型的DataContext可以看我前面一篇文章,强

SQL Server误区:即时文件初始化特性可以在SQL Server中 a)开启 和 b)关闭

误区 #3: 即时文件初始化特性可以在SQL Server中 a)开启 和 b)关闭 a)是不允许的  b)是允许的 即时文件初始化是一个在SQL Server 2005以及之上的版本鲜为人知的特性.这个特性允许数据文件(仅仅是数据文件,不包括日志文件)初始化的过程跳过填0初始化过程.这种方式是在发生灾难时大大减少Downtime的好办法---在恢复数据库时由于免去了填0初始化的过程而直接开始恢复过程. 我之前已经写过关于即时文件初始化误区的文章了(见Misconceptions around

为SQL Server 2005配置Windows即时初始化

问题 SQL Server 2005支持数据库即时文件初始化(Instant File Initialization),这种即时文件初始化可以跳过清零数据的页面,这样做可以在执行一些操作,比如创建数据库,增加文件到现有的数据库中,手动.通过自动增长(autogrowth)或保存一个数据库或文件组来增大现有数据库文件时,减少时间.但是,我们如何确定SQL Server正在使用这个功能? 专家解答 在SQL Server以前的版本中,数据和日志文件一开始是通过在你执行之前提到的某项操作时,用零归档这

从Linq中获取sql语句

问题描述 通常,我们直接IQueryable<T>.ToList()获取IList<T>,但这一次我需要得到其对应的sql语句,然后对sql语句进行再加工.我记得是有这样一个功能的,而且也应该有这样一个功能呀,不然最终用的sql从哪里来?我主要是要利用Sphinx,需要将正常Linq得到的结果和SphinxOE进行join. 解决方案 解决方案二:直接写sql吧用EF的SqlQueryhttps://msdn.microsoft.com/en-us/data/jj592907.as

如何根据linq 表达式生成SQL代码

问题描述 代码运行后得出的SQL代码来不正确,company的被解析成Convert(value(WXMAPTEST.Form1+<>c__DisplayClass0).company))请高手帮忙,下面贴出所有代码privatevoidbutton1_Click(objectsender,EventArgse){using(SqlConnectionSQC=newSqlConnection()){SQC.ConnectionString="DataSource=TESTSERVER

Linq之隐式类型、自动属性、初始化器、匿名类

目录 写在前面 系列文章 隐式类型 自动属性 初始化器 匿名类 总结 写在前面 上篇文章是本系列的小插曲,也是在项目中遇到,觉得有必要总结一下,就顺手写在了博客中,也希望能帮到一些朋友.本文将继续介绍linq系列的基础知识,隐式类型,自动属性,初始化器,匿名类的相关概念,这些内容也许与linq相关也许不相关,但还是放一起总结吧,也算是复习了.部分内容通过反编译的方式一探究竟. 系列文章 Linq之Lambda表达式初步认识 Linq之Lambda进阶 隐式类型 先看看Msdn上对隐式类型的简单定

lifecycleexception:JSF 源代码赏析之Lifecycle

JSF的生命周期在JSF应用中起着至关重要的作用,每一个JSF请求的处理都需要经过一次生命周期,本文从源码的角度分析JSF的生命周期.在讨论生命周期之前,我们先要讨论FacesContext的一些元素,他们在整个生命周期中扮演了非常重要的角色.么个JSF应用必须保存它所处理的请求信息,FacesContext为处理请求和生成响应保存了所有必需的上下文信息,具体而言,它包括:1.信息队列,MessageQueue,保存所有的消息2.当前的组件树,ViewRoot,3.外部上下文,ExternalC

linux内核md源代码解读 二 md模块初始化

在编译完成linux内核源代码的时候,drivers/md目录下会生成多个ko文件,那么这些内核模块哪一个先加载,哪一个后加载的呢?例如md-mod.ko, raid5.ko, raid10.ko,这些模块是一起加载的呢,还是有先后顺序呢?如果熟悉linux内核编程的话,知道有一个request_module函数,这个函数用于请求加载一个模块,但这个函数并不能说明一个模块对另一个模块的依赖关系.准确的信息还是来自于Kconfig,这里只抽取Kconfig中相关的部分: config BLK_DE