前端之家收集整理的这篇文章主要介绍了
让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子节点添加配置如下:
<
provider
invariantName="System.Data.sqlite" type="System.Data.sqlite.EF6.sqliteProviderServices,System.Data.sqlite.EF6" />
接着在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"/>
这下终于支持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