让EntityFramework6支持SQLite

前端之家收集整理的这篇文章主要介绍了让EntityFramework6支持SQLite前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

原文地址:http://www.cnblogs.com/lifeil/p/3944334.html

最近给朋友的小孩做了一个毕业设计。用的是asp.netMVC5 +EntityFramework6 +sqlServer 2008.

结果做好后,朋友说能不能不要数据库,直接运行?顿时让我很纠结,不需要安装数据库但又能运行的,只能考虑单文件数据库了,比如说Access或是sqlite。

查阅资料后发现Access无法支持EntityFramework的运行,只要考虑sqlite。

经查阅资料发现,sqlite方法发布了对EntityFramework6支持的程序集,在项目中执行如下命令:

1
2
Install-Package System.Data.sqlite.EF6
Install-Package System.Data.sqlite.Linq

安装后会出现三个引用:


接着Web.config中配置如下:

<configSections>
    <!-- For more information on Entity Framework configuration,visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
        section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection,EntityFramework,Version=6.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089" requirePermission="false" />
   
  </>
  connectionStringsadd ="EducationStrings" providerName="System.Data.sqlite.EF6" connectionString="Data Source=education.db;Pooling=True" />
  >
entityFrameworkproviders>
      provider invariantName="System.Data.sqlite.EF6.sqliteProviderServices,System.Data.sqlite.EF6" />
    defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory,EntityFramework"parameters>
        parameter value="v11.0" />
      defaultConnectionFactorysystem.dataDbProviderFactoriesremove invariant="System.Data.sqlite.EF6" ="sqlite Data Provider (Entity Framework 6)" invariant description=".Net Framework Data Provider for sqlite (Entity Framework 6)"="System.Data.sqlite.EF6.sqliteProviderFactory,255); line-height:1.5!important">>

这样配置后,发现会抛异常信息如下:

1
Unable to determine the provider name for provider factory of type 'System.Data.sqlite.sqliteFactory'. Make sure that the ADO.NET provider is installed or registered in the application config.

大概是说没有找个支持ado.net的管道工厂方法。在stackoverflow搜索发现,需要在Web.config中添加对System.Data.sqlite.sqliteFactory的配置。

在entityFramework节点的providers子节点添加配置如下:

<providerinvariantName="System.Data.sqlite" type="System.Data.sqlite.EF6.sqliteProviderServices,System.Data.sqlite.EF6" />

接着在system.data节点的DbProviderFactories子节点配置如下:

addname="sqlite Data Provider" invariant="System.Data.sqlite" description=".Net Framework Data Provider for sqlite" type="System.Data.sqlite.sqliteFactory,System.Data.sqlite"/>

这下终于支持ado.net了,但是,又会抛如下异常:

unable to open database file

大概是无法打开数据库文件,经查资料发现,程序读取sqlite数据库时需要使用物理绝对路径解决方法有两个,一个是在代码中指定数据库配置文件,一个是在Web.config中指定一个类似变量的值,如下:

="Data Source=|DataDirectory|\education.db;Pooling=True" />

其中DataDirectory指的是数据库的目录,对应着的是asp.net项目下的App_Data文件夹,所以,需要把数据库放到该目录。

修改完毕后又会抛另外一个异常:

sql logic error or missing database
no such table: Articles

大概是说没有找到表Articles,我的项目用的是CodeFirst模式,看来sqlite不支持CodeFirst模式,只能手动建表了。如果表比较少或是字段比较少还行,如果有大量的表,光手动建表也得费好大事,如果能够把sqlServer 2008的数据库导入到sqlite中就好了。

经谷歌后,终于找到一个工具sqlConverter,该工具能够将sqlServer的表和表内的数据库转换成sqlite。

经转换后发现,sqlite中的主键只能是integer类型的,对应C#的int64。而我的Model却是int32,不知道是sqlite规定的还是工具转换有问题。

完整的Web.config配置如下:

1 <?xml version="1.0" encoding="utf-8"?> @H_502_275@ 2 <!-- @H_502_275@ 3 有关如何配置 ASP.NET 应用程序的详细信息,请访问 @H_502_275@ 4 http://go.microsoft.com/fwlink/?LinkId=301880 @H_502_275@ 5 --> @H_502_275@ 6 configuration@H_502_275@ 7 @H_502_275@ 8 @H_502_275@ 9 /> @H_502_275@10 @H_502_275@11 @H_502_275@12 appSettings@H_502_275@13 key="webpages:Version" value="3.0.0.0" @H_502_275@14 ="webpages:Enabled"15 ="ClientValidationEnabled"="true" @H_502_275@16 ="UnobtrusiveJavaScriptEnabled"17 @H_502_275@18 @H_502_275@19 <add name="EducationStrings" providerName="System.Data.sqlClient" connectionString="Data Source=.; User=sa;Password=123456;Initial Catalog=EducationDb;Integrated Security=True" />@H_502_275@20 @H_502_275@21 @H_502_275@22 system.web@H_502_275@23 compilation debug="true" targetFramework="4.5" @H_502_275@24 httpRuntime targetFramework@H_502_275@25 @H_502_275@26 system.webServer@H_502_275@27 validation validateIntegratedModeConfiguration@H_502_275@28 modules runAllManagedModulesForAllRequests="true"@H_502_275@29 <add name="AuthorizeModule" type="Education.Web.AuthorizeModule"/>@H_502_275@30 modules@H_502_275@31 @H_502_275@32 @H_502_275@33 runtime@H_502_275@34 assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"@H_502_275@35 dependentAssembly@H_502_275@36 assemblyIdentity ="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed" @H_502_275@37 bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" @H_502_275@38 @H_502_275@39 @H_502_275@40 ="System.Web.Optimization"="31bf3856ad364e35" @H_502_275@41 ="1.0.0.0-1.1.0.0"="1.1.0.0" @H_502_275@42 @H_502_275@43 @H_502_275@44 ="WebGrease"45 ="0.0.0.0-1.5.2.14234"="1.5.2.14234" @H_502_275@46 @H_502_275@47 @H_502_275@48 ="System.Web.Helpers"49 ="1.0.0.0-3.0.0.0"50 @H_502_275@51 @H_502_275@52 ="System.Web.WebPages"53 ="0.0.0.0-3.0.0.0"54 @H_502_275@55 @H_502_275@56 ="System.Web.Mvc"57 ="0.0.0.0-5.2.0.0"="5.2.0.0" @H_502_275@58 @H_502_275@59 assemblyBinding@H_502_275@60 @H_502_275@61 @H_502_275@62 @H_502_275@63 ="System.Data.sqlite"64 @H_502_275@65 @H_502_275@66 @H_502_275@67 @H_502_275@68 @H_502_275@69 @H_502_275@70 @H_502_275@71 @H_502_275@72 @H_502_275@73 @H_502_275@74 @H_502_275@75 ="sqlite Data Provider"=".Net Framework Data Provider for sqlite"="System.Data.sqlite.sqliteFactory,System.Data.sqlite"@H_502_275@76 @H_502_275@77 @H_502_275@78 @H_502_275@79 这样终于可以运行了。附代码和工具。

代码下载:

http://download.csdn.net/detail/lifeilin6671/7837447

转换工具下载:

http://download.csdn.net/detail/lifeilin6671/7837465

猜你在找的Sqlite相关文章