在这里安装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)。
public partial class BloggingContext : DbContext { public BloggingContext(): base("Name=BloggingContext") { } public DbSet<Blog> Blogs { get; set; } public DbSet<Post> Posts { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Configurations.Add(new BlogMap()); modelBuilder.Configurations.Add(new PostMap()); } }其中Blog和Post是2个实体类(POCO),这里就不在赘述了。
我们主要来关注下这个构造函数,它向程序集 EntityFramework.dll里面,命名空间namespace System.Data.Entity下的DbContext类传递了一个数据库连接字符串的名字。
为此我们来配置下当前Web.config文件里面的数据库连接字符串:
<connectionStrings> <add name="BloggingContext" connectionString="Data Source=|DataDirectory|\Enterprise.sqlite3" providerName="System.Data.sqlite" /> </connectionStrings>我们来看看这个连接字符串,因为在web下我们可以使用|DataDirectory|来代表根目录下的App_Data文件夹,所以我们把连接字符串写成了上面的形式。
下面列出2种类型数据库的类型做下对比:
<connectionStrings> <add name="BloggingContext" connectionString=" Data Source=(localdb)\v11.0; Initial Catalog=Blogging;Integrated Security=True; MultipleActiveResultSets=True" providerName="System.Data.sqlClient" /> </connectionStrings>
Oracle数据库连接字符串:
<connectionStrings> <add name="BloggingContext" connectionString=" data source=test;password=123456;user id=sa;" providerName="Oracle.DataAccess.Client" /> </connectionStrings>只是数据提供程序不一样,也就是providerName属性值指定了当前的数据提供程序是什么。
下面的配置才是重点:
既然EntityFramework要提供一种通用的数据库访问逻辑,那么它就要适用于所有的数据库,那么微软是如何做到的呢?答案是抽象工厂
我们先在Web.config文件里面配置如下的配置节,稍后再讲整个的流程是如何运作的。
sqliteFactory数据工厂(针对sqlite数据库)
<system.data> <DbProviderFactories> <add name="sqlite Data Provider" invariant=" System.Data.sqlite" description=".NET Framework Data Provider for sqlite" type="System.Data.sqlite.sqliteFactory,System.Data.sqlite,Version=1.0.90.0,Culture=neutral,PublicKeyToken=db937bc2d44ff139" /> </DbProviderFactories> </system.data>
Oracle数据工厂
<system.data> <DbProviderFactories> <add name="Oracle Data Provider for .NET" invariant="Oracle.DataAccess.Client" description="Oracle Data Provider for .NET" type="Oracle.DataAccess.Client.OracleClientFactory,Oracle.DataAccess,Version=4.112.3.0,PublicKeyToken=89b483f429c47342" /> </DbProviderFactories> </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,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链接:请自行下载(如果对你有所帮助,不胜荣幸)