Entity Framework使用Sqlite时的一些配置

前段时间试着用Entity Framework for Sqlite环境,发现了一些坑坑洼洼,记录一下。

同时试了一下配置多种数据库,包括Sqlite、Sql Server、Sql Server LocalDB、Sql Server Compact。

我建的demo项目结构以及通过NuGet安装的包:

 

EFDemo.MultipleDB.UI引用了EFDemo.MutipleDB项目。

1. 遇到的异常1

The Entity Framework provider type ‘System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6‘ registered in the application config file for the ADO.NET provider with invariant name ‘System.Data.SQLite.EF6‘ could not be loaded. Make sure that the assembly-qualified name is used and that the assembly is available to the running application. See http://go.microsoft.com/fwlink/?LinkId=260882 for more information.

我是是引用了Sqlite相关的dll了的(见下图),但是发现生成后再EFDemo.MultipleDB.UI下的生成文件中没有自动将这些dll拷贝过来。

2.

于是我将这些手动拷贝过来了。

2. 遇到的异常2

刚才的异常没了,又出现了一个异常。

The Entity Framework provider type ‘System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer‘ registered in the application config file for the ADO.NET provider with invariant name ‘System.Data.SqlClient‘ could not be loaded. Make sure that the assembly-qualified name is used and that the assembly is available to the running application. See http://go.microsoft.com/fwlink/?LinkId=260882 for more information.

这次在代码里面加了这么一段,不用调用,只是在代码里让它存在:

        /// <summary>
        /// 解决provider不能自动加载的问题
        /// (不需要调用,放在这里即可)
        /// </summary>
        private static void FixProvidersNotAutoLoadProblem()
        {
            var _ = typeof(System.Data.SQLite.EF6.SQLiteProviderFactory);
            var __ = typeof(System.Data.Entity.SqlServer.SqlProviderServices);
            var ___ = typeof(System.Data.Entity.SqlServerCompact.SqlCeProviderServices);
        }

3. 遇到的异常3

使用了上面的方法,上面的那个异常没了,又一个新的来了。

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.

Sqlite的那些包是通过NuGet安装的,但是NuGet貌似没有帮忙生成完整的配置,所以需要自己补上。

这里贴上的是完整的,注意红色的是添加的:

  <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" />
      <remove invariant="System.Data.SqlServerCe.4.0" />
      <add name="Microsoft SQL Server Compact Data Provider 4.0" invariant="System.Data.SqlServerCe.4.0" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
    </DbProviderFactories>
  </system.data>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlCeConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="System.Data.SqlServerCe.4.0" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
      <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
      <provider invariantName="System.Data.SqlServerCe.4.0" type="System.Data.Entity.SqlServerCompact.SqlCeProviderServices, EntityFramework.SqlServerCompact" />
    </providers>
  </entityFramework>

4. 虽然使用的是Code First,但是System.Data.SQLite.EF6是不能帮助我们自动生成数据库的表结构的,需要手动创建。(当然,可以找找有没有其他支持Sqlite的Migration的EF Provider)

OK了,到此这几个坑算是填平了。

5. 设置DataDirectory

我的Sqlite的连接字符串是这样写的:

<add name="BloggingContext_SQLite" connectionString="Data Source=|DataDirectory|\Blogging_SQLite.db" providerName="System.Data.SQLite.EF6"/>

为了开发方便,我将数据库文件放在了项目里面,这个样子:

怎样告诉连接字符串DataDirectory在这里呢?

        private static void SetDataDir()
        {
            DirectoryInfo baseDir = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory);
            string data_dir = baseDir.FullName;
            if ((baseDir.Name.ToLower() == "debug" || baseDir.Name.ToLower() == "release")
                && (baseDir.Parent.Name.ToLower() == "bin"))
            {
                data_dir = Path.Combine(baseDir.Parent.Parent.FullName, "App_Data");
            }

            AppDomain.CurrentDomain.SetData("DataDirectory", data_dir);
        }

在程序初始化时调用。

附:

完整代码在这里

时间: 2024-10-12 21:50:46

Entity Framework使用Sqlite时的一些配置的相关文章

Asp.Net Identity,Entity Framework 与 Sqlite

1.Asp.Net Identity核心引用 Microsoft.AspNet.Identity.Core  核心库,包含Identity的主要功能. Microsoft.AspNet.Identity.EntityFramework 主要包括ASP.NET Identity 的EF 部分的实现. Microsoft.AspNet.Identity.OWIN ASP.NET Identity对OWIN 的支持. 安装方式:创建Asp.Net Web 时选择身份验证或者使用NuGet安装 通过在P

VS2010使用Entity FrameWork操作Sqlite数据库

这几天在研究如何使用Entity Framework 访问数据库,其中也走了不少弯路,还好最后搭建环境成功,下面就详细说明下环境搭建步骤 1.下载安装SQLite Data Provider 至官网:http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki下载版本sqlite-netFx40-setup-bundle-x86-2010-1.0.93.0.exe 注意版本需要是1.0.93.0 2.用NuGet程序包

Entity Framework添加记录时获取自增ID值

var m = new 你的Model(); db.你的Model.add(m); db.SaveChange(); Response.Write(m.Id); //执行.SaveChange()保存后就直接可以取得id值了. 保存前没有id值. Entity Framework在将数据插入数据库时,如果主键字段是自增标识列,会将该自增值返回给实体对象对应的属性. 比如下面添加博客随笔至数据库的示例代码: var blogPost = new BlogPost() { Author = "博客园

Entity Framework 5.0系列之约定配置

Code First之所以能够让开发人员以一种更加高效.灵活的方式进行数据操作有一个重要的原因在于它的约定配置.现在软件开发越来复杂,大家也都试图将软件设计的越来越灵活,很多内容我们都希望是可配置的,但是过多的配置也会带来很大的工作量,解决这个问题的方法就是约定.对于一些简单的,不太可能经常变化的内容我们以一种约定的方式进行设计.使用过其他ORM框架的朋友可能知道一般ORM都有对应的映射配置文件(一般是一个Xml文件),但是EF并没有.在EF中是以一种约定的方式进行表.列同实体类进行映射的,与此

【转】Entity Framework 5.0系列之约定配置

Code First之所以能够让开发人员以一种更加高效.灵活的方式进行数据操作有一个重要的原因在于它的约定配置.现在软件开发越来复杂,大家也都试图将软件设计的越来越灵活,很多内容我们都希望是可配置的,但是过多的配置也会带来很大的工作量,解决这个问题的方法就是约定.对于一些简单的,不太可能经常变化的内容我们以一种约定的方式进行设计.使用过其他ORM框架的朋友可能知道一般ORM都有对应的映射配置文件(一般是一个Xml文件),但是EF并没有.在EF中是以一种约定的方式进行表.列同实体类进行映射的,与此

填坑 - 使用Entity Framework 6 + Sqlite进行DB first开发

Sqlite团队也是渣啊,到第6代了还不支持Code First. 1.安装运行环境和组件 1.安装SQLite的Visual Studio设计器支持 只有安装了它,在[新建ADO.NET实体数据模型]时才会有Sqlite的数据源选项.我的环境是64位+VS2013,这里使用的是VS2013,对应的是sqlite-netFx451-setup-bundle-x86-2013-1.0.98.0.exe. 什么?我为什么下载X86的?因为我发现X64缺失了一些选项(Install the desgn

Programming Entity Framework CodeFirst--数据库约定和配置

这一章主要主要讲的是我们的模型如何映射到数据库,而不影响模型,以及不同的映射场景. 一.表名和列名 1.指定表名 [Table("PersonPhotos")] public class PersonPhoto 或 [Table("Locations", Schema="baga")] public class Destination Schema修改数据库架构,默认是dbo. API: modelBuilder.Entity<Destin

Entity Framework连接MySQL时:由于出现以下异常,无法生成模型:“表“TableDetails”中列“IsPrimaryKey”的值为DBNull.

1.cmd 2.c:\Users\Administrator>cd c:\Program Files\MySQL\MySQL Server 5.7\bin 3c:\Program Files\MySQL\MySQL Server 5.7\bin>mysql -h localhost -u root -p 4.Enter password: 数据库密码 5.use  表名; 6.set global optimizer_switch='derived_merge=OFF'; 7.终于成功!

SQLITE WITH ENTITY FRAMEWORK CODE FIRST AND MIGRATION

Last month I’ve a chance to develop an app using Sqlite and Entity Framework Code First. Before I started with this project, I thought everything will be easy because Sqlite and Entity Framework are both popular framework. Maybe I just need to instal