因为最近没有时间深入的研究EntityFramework的内部机制,所以具体的实现并不十分了解。微软最初的初衷是开发出一套通用的数据库访问逻辑,实现对Dal数据访问层的高度封装,其中就用到了工厂模式和抽象工厂模式。

在以下的说明中我主要以创建一个简单的web工程来讲解,Sqlite下EntityFramework的伪CodeFirst模式的实现。

说明:以下Sqlite实现不支持CodeFirst的(Migration)数据库迁移,数据库是事前创建好的

1.我们首先建立一个空的WebApplication1

2.我们给当前的工程添加EntityFramework.dll类库,并使用Nuget来维护我们的程序包(Packages),如图所示:

在这里安装EntityFramwork的时候我带上了版本号,因为EntityFramework5用的比较多,所以这里还是用老版本好了(2014年2月22日当前最新版本是6.0)。EntityFramework.dll在Nuget上的官网位置为:

http://www.nuget.org/packages/EntityFramework/

3.EntityFramework安装好了以后,我们就要添加Sqlite的dll程序集了,我这里下载了2个文件直接放在了项目的bin目录下,如下图:

当然我们也可以使用Package Manager Console完成操作:(Sqlite在Nuget上的地址为:http://www.nuget.org/packages/system.data.sqlite)

4.至此为止我们基本的配置已经完成了。下面开始按照CodeFirst模式创建实体模型类和数据上下文类了(DbContext)。

先看看数据库上下文类:(以下代码仅供参考)

  1. public partial class BloggingContext : DbContext
  2. {
  3. public BloggingContext(): base("Name=BloggingContext")
  4. {
  5. }
  6. public DbSet<Blog> Blogs { get; set; }
  7. public DbSet<Post> Posts { get; set; }
  8. protected override void OnModelCreating(DbModelBuilder modelBuilder)
  9. {
  10. modelBuilder.Configurations.Add(new BlogMap());
  11. modelBuilder.Configurations.Add(new PostMap());
  12. }
  13. }

其中Blog和Post是2个实体类(POCO),这里就不在赘述了。

我们主要来关注下这个构造函数,它向程序集 EntityFramework.dll里面,命名空间namespace System.Data.Entity下的DbContext类传递了一个数据库连接字符串的名字。

为此我们来配置下当前Web.config文件里面的数据库连接字符串:

  1. <connectionStrings>
  2. <add name="BloggingContext"
  3. connectionString="Data Source=|DataDirectory|\Enterprise.sqlite3"
  4. providerName="System.Data.SQLite" />
  5. </connectionStrings>

我们来看看这个连接字符串,因为在web下我们可以使用|DataDirectory|来代表根目录下的App_Data文件夹,所以我们把连接字符串写成了上面的形式。

下面列出2种类型数据库的类型做下对比:

SqlServer数据库连接字符串:

  1. <connectionStrings>
  2. <add name="BloggingContext" connectionString="
  3. Data Source=(localdb)\v11.0;
  4. Initial Catalog=Blogging;Integrated Security=True;
  5. MultipleActiveResultSets=True"
  6. providerName="System.Data.SqlClient" />
  7. </connectionStrings>

Oracle数据库连接字符串:

  1. <connectionStrings>
  2. <add name="BloggingContext" connectionString="
  3. data source=test;password=123456;user id=sa;"
  4. providerName="Oracle.DataAccess.Client" />
  5. </connectionStrings>

只是数据提供程序不一样,也就是providerName属性值指定了当前的数据提供程序是什么。

下面的配置才是重点:

既然EntityFramework要提供一种通用的数据库访问逻辑,那么它就要适用于所有的数据库,那么微软是如何做到的呢?答案是抽象工厂

我们先在Web.config文件里面配置如下的配置节,稍后再讲整个的流程是如何运作的。

SqliteFactory数据工厂(针对Sqlite数据库)

  1. <system.data>
  2. <DbProviderFactories>
  3. <add name="SQLite Data Provider" invariant="
  4. System.Data.SQLite"
  5. description=".NET Framework Data Provider for SQLite"
  6. type="System.Data.SQLite.SQLiteFactory,
  7. System.Data.SQLite, Version=1.0.90.0, Culture=neutral,
  8. PublicKeyToken=db937bc2d44ff139" />
  9. </DbProviderFactories>
  10. </system.data>

Oracle数据工厂

  1. <system.data>
  2. <DbProviderFactories>
  3. <add name="Oracle Data Provider for .NET"
  4. invariant="Oracle.DataAccess.Client"
  5. description="Oracle Data Provider for .NET"
  6. type="Oracle.DataAccess.Client.OracleClientFactory,Oracle.DataAccess,
  7. Version=4.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
  8. </DbProviderFactories>
  9. </system.data>

这个配置节在C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\App.config文件下面也有,默认的只有SqlServer数据库的,数据工厂。

System.Data程序集下面的System.Data.Common.DbProviderFactoriesConfigurationHandler 处理程序会解析<System.data/>配置节

在上面的:base("Name=BloggingContext")初始化DbContext构造函数的时候,就根据提供的数据库连接字符串找到了,当前的数据库提供程序(当前示例是:System.Data.Sqlite)

然后System.Data.Common下面的静态类DbProviderFactories的System.Data.Common.DbProviderFactories.GetFactoryClasses()。

(摘要:返回一个 System.Data.DataTable,其中包含有关实现 System.Data.Common.DbProviderFactory 的所有已安装提供程序的信息。)

然后GetFactory方法通过数据库连接字符串提供的providerName="System.Data.Sqlite",从GetFactoryClasses中找到invariant的值为System.Data.Sqlite的

已安装提供程序的信息(type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite, Version=1.0.90.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139")

这样通过反射就能动态创建System.Data.SQLite.SQLiteFactory工厂类了,工厂类创建完成以后,我们就能通过工厂类提供的工厂方法,创建Ado.net数据库访问实例就行数据库访问了。

Oracle使用EntityFramework(CodeFirst模式)注意事项

1、安装Oracle客户端,默认装在D:\app下面(盘符随意)

2、我们看下Oracle自带的ODP.Net组件装在了以下的路径,D:\app\Administrator\product\11.2.0\dbhome_1\ODP.NET\bin\4.0

3、我们要把第二步所示的目录下面的Oracle.DataAccess.dll拷贝到,Web引用程序的主站点下面,或者注册全局程序集缓存(GAC)

4、上述1-3的步骤,取决于你的Oracle客户端的版本,因为EntityFramework5.0只能运行在.NetFramework4.0以上,所以我们的Oracle.DataAccess.dll也必须是4.0的,也就是说D:\app\Administrator\product\11.2.0\dbhome_1\ODP.NET\bin\  这个路径下必须有4.0的ODP.NET程序集,不然的话你就要去Oracle的官网下载ODAC对应.Net4.0的插件了。

5、同样要配置web.config文件的DbProviderFactorys(不要忘记了哦)

后续会补上类之间的继承关系。

应楼下要求附上Demo链接:请自行下载(如果对你有所帮助,不胜荣幸)

http://download.csdn.net/detail/applewangpai/6959853

Entityframework 伪CodeFirst开发模式应用于Sqlite数据库的更多相关文章

  1. Asp.net MVC 中 CodeFirst 开发模式实例

    昨天写的这篇博客因为下班时间到了忘记保存了,好郁闷,得重新写一遍.实习所在公司使用的是CodeFirst开发模式,最近开始参与到公司的项目里面来了,发现这个模式特别好用,建库建表改变字段属性添加删除字 ...

  2. C# 动态生成word文档 [C#学习笔记3]关于Main(string[ ] args)中args命令行参数 实现DataTables搜索框查询结果高亮显示 二维码神器QRCoder Asp.net MVC 中 CodeFirst 开发模式实例

    C# 动态生成word文档 本文以一个简单的小例子,简述利用C#语言开发word表格相关的知识,仅供学习分享使用,如有不足之处,还请指正. 在工程中引用word的动态库 在项目中,点击项目名称右键-- ...

  3. ASP.NET MVC——CodeFirst开发模式

    Entity Framework框架提供了几种开发模式,比如Database First,Model First,Code First.Database First是最老也是应用得最广泛的一种设计方式 ...

  4. 领域驱动和MVVM应用于UWP开发的一些思考

    领域驱动和MVVM应用于UWP开发的一些思考 0x00 起因 有段时间没写博客了,其实最近本来是根据梳理的MSDN上的资料(UWP开发目录整理)有条不紊的进行UWP学习的.学习中有了心得体会或遇到了问 ...

  5. IT企业级应⽤开发模式演化

    前端研发流程 传统To B类系统的研发模式 探索 & 思考设计模式库(DPL)设计语⾔设计语⾔详解基于MVVM模式的Web框架 & UI库优化后的开发模式实现价值实践 赋能 赋能授权( ...

  6. JavaScript应用于asp开发场景

    JavaScript应用于asp开发场景 演示代码示例: <%Path="../"%> <!--#include file="../../Inc/Con ...

  7. IT企业级应?开发模式演化

    原文:IT企业级应?开发模式演化 前端研发流程 传统To B类系统的研发模式 探索 & 思考设计模式库(DPL)设计语⾔设计语⾔详解基于MVVM模式的Web框架 & UI库优化后的开发 ...

  8. EntityFramework 学习 一 三种开发模式

    Entity Framework支持3种不同的开发方法 1.Code First 2.Model First 3.Database First Code First 使用Code First开发模式, ...

  9. AppBox升级进行时 - 拥抱Entity Framework的Code First开发模式

    AppBox 是基于 FineUI 的通用权限管理框架,包括用户管理.职称管理.部门管理.角色管理.角色权限管理等模块. 从Subsonic到Entity Framework Subsonic最早发布 ...

随机推荐

  1. linux之SQL语句简明教程---GROUP BY

    我们现在回到函数上.记得我们用 SUM 这个指令来算出所有的 Sales (营业额)吧!如果我们的需求变成是要算出每一间店 (Store_Name) 的营业额 (Sales),那怎么办呢?在这个情况下 ...

  2. ACM计算几何题目推荐

    //第一期 计算几何题的特点与做题要领: 1.大部分不会很难,少部分题目思路很巧妙 2.做计算几何题目,模板很重要,模板必须高度可靠. 3.要注意代码的组织,因为计算几何的题目很容易上两百行代码,里面 ...

  3. hdu 4740 The Donkey of Gui Zhou(dfs模拟好题)

    Problem Description There was no donkey ,) , the down-right cell ,N-) and the cell below the up-left ...

  4. CSS3重点总结

    CSS3重点总结(1)兄弟选择器:2种:+. ~ 1.相邻兄弟选择器(+):选择器1+选择器2 选择"选择器1"相邻的后一个兄弟"选择器2" 强调:选中的是自己 ...

  5. 谈谈 css 的各种居中——读编写高质量代码有感

    css 的居中有水平居中和垂直居中,这两种居中又分为行内元素居中和块级元素居中,不同的居中用不同方法. 水平居中 1.行内元素水平居中(文本,图片) 给父层设置 text-align:center; ...

  6. Windows计算器使用详解

    (1)Backspace:退格,删除当前输入数字中的最后一位 (2)CE:清除,清除显示的数字. (3)C:归零,清除当前的计算. (4)MC:清除存储器中的数值. (5)MR:将存于存储器中的数显示 ...

  7. TCP/IP详解之:广播和多播

    第12章 广播和多播 广播是将数据报发送到网络中的所有主机(通常是本地相连的网络): 多播是将数据报发送到网络的一个主机组: 这两个概念的基本点在于当收到送往上一个协议栈的数据帧时采用不同类型的过滤. ...

  8. 万事开头难——Cocos2d-x学习历程(一)

    万事开头难,不知该从哪里开始,不过既然要学习一样新东西,那就从了解它开始吧... Cocos2d-x是一个通用平面游戏引擎,基于一个同样十分著名的游戏引擎Cocos2d-iPhone设计,Cocos2 ...

  9. 基于jQuery的前端如何做到无伤迁移

    首先,解释一下我个人对前端无伤迁移的理解,即移动端和PC端使用同一套代码,或者说原本在PC端运行得很完美的代码,只要修改少许,就可以在移动端完美运行. 当然,大部分的公司会专门为移动端设计了一套,同时 ...

  10. Python : 熟悉又陌生的字符编码(转自Python 开发者)

    Python : 熟悉又陌生的字符编码 字符编码是计算机编程中不可回避的问题,不管你用 Python2 还是 Python3,亦或是 C++, Java 等,我都觉得非常有必要厘清计算机中的字符编码概 ...