让EntityFramework6支持SQLite

让EntityFramework6支持SQLite,第1张

概述原文地址:http://www.cnblogs.com/lifeil/p/3944334.html 最近给朋友的小孩做了一个毕业设计。用的是asp.net MVC5 + EntityFramework6 + SQL Server 2008. 结果做好后,朋友说能不能不要数据库,直接运行?顿时让我很纠结,不需要安装数据库但又能运行的,只能考虑单文件的数据库了,比如说Access或是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 databaseno 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"?> 2 <!-- 3 有关如何配置 ASP.NET 应用程序的详细信息,请访问 4 http://go.microsoft.com/fwlink/?linkID=301880 5 --> 6 configuration 7 8 9 />10 11 12 appSettings13 key="webpages:Version" value="3.0.0.0" 14 ="webpages:Enabled"15 ="ClIEntValIDationEnabled"="true" 16 ="UnobtrusiveJavaScriptEnabled"17 18 19 <add name="EducationStrings" provIDername="System.Data.sqlClIEnt" connectionString="Data Source=.; User=sa;Password=123456;Initial Catalog=EducationDb;Integrated Security=True" />20 21 22 system.web23 compilation deBUG="true" targetFramework="4.5" 24 httpRuntime targetFramework25 26 system.webServer27 valIDation valIDateIntegratedModeConfiguration28 modules runAllManagedModulesForAllRequests="true"29 <add name="AuthorizeModule" type="Education.Web.AuthorizeModule"/>30 modules31 32 33 runtime34 assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"35 dependentAssembly36 assemblyIDentity ="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed" 37 bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" 38 39 40 ="System.Web.Optimization"="31bf3856ad364e35" 41 ="1.0.0.0-1.1.0.0"="1.1.0.0" 42 43 44 ="WebGrease"45 ="0.0.0.0-1.5.2.14234"="1.5.2.14234" 46 47 48 ="System.Web.Helpers"49 ="1.0.0.0-3.0.0.0"50 51 52 ="System.Web.WebPages"53 ="0.0.0.0-3.0.0.0"54 55 56 ="System.Web.Mvc"57 ="0.0.0.0-5.2.0.0"="5.2.0.0" 58 59 assemblyBinding60 61 62 63 ="System.Data.sqlite"64 65 66 67 68 69 70 71 72 73 74 75 ="sqlite Data ProvIDer"=".Net Framework Data ProvIDer for sqlite"="System.Data.sqlite.sqliteFactory,System.Data.sqlite"76 77 78 79 这样终于可以运行了。附代码和工具。

代码下载:

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

转换工具下载:

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

总结

以上是内存溢出为你收集整理的让EntityFramework6支持SQLite全部内容,希望文章能够帮你解决让EntityFramework6支持SQLite所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/1163471.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存