本来以为不需要写这个二的。
按步骤一的过程安装配置好以后,在vs2013中已经可以用服务器资源管理器正常地访问建好的SQLite数据文件,也可以在项目中新建实体对象。使用EF的dbfirst方式也能正常地从数据库刷新对象。
谁知道到了后面,在程序中需要访问数据库的时候,执行到db.savechanges时,报未找到具有固定名称“System.Data.SQLite”的 ADO.NET 提供程序的实体框架提供程序的错误,原来坑在这里等着。
翻了好久网页,才终于解决这个问题。
解决方法是在app.config中加上System.Data.SQLite的provider。
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="v11.0" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
<provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
<provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
</providers>
</entityFramework>
<system.data>
<DbProviderFactories>
<remove invariant="System.Data.SQLite" />
<add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".NET Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
<remove invariant="System.Data.SQLite.EF6" />
<add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6" />
</DbProviderFactories>
</system.data>
其实网上也有好几个回答是这个解决办法的,但是最容易搜到的几个好像都是错的。
应该添加名为System.Data.SQLite.的provider,type应该是“System.Data.SQLite.SQLiteFactory, System.Data.SQLite”,而网上好几个回答里面都只改了名字而type仍然是“System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6”。开始的时候我照着这个答案没有修改,结果一直还是报错。最后改成现在的写法,才能顺利通过。
ps:过了这个坑后,又发现另一个坑。在网页中使用ef对数据进行操作的时候,报“The underlying provider failed on Open sqlite”的错误。原因是ef默认使用当前用户的权限来访问数据库。当应用是网页的时候,就会使用IIS_IUSRS用户来访问SQLite数据文件。所以数据文件所在的文件夹要加上IIS_IUSRS的访问权限,那样就可以顺利访问了。