使用EF完成基于SQLite的CodeFirst

使用EF完成基于SQLite的CodeFirst

操作流程

引用类库

  1. System.Data.SQLite,这个类库是SQlite的核心支持,使用别的ORM框架也需要,例如:LINQ2DBSQLite

  2. SQLite.CodeFirst,EF本身不支持SQLite的CodeFirst模式,这是一个大佬做的封装,引入以后,只需要做少部分修改,就可以丝滑的支持CodeFirst.虽然只引入System.Data.SQLite也可以使用,但是引入SQLite.CodeFirst更丝滑,省事,谁会不喜欢他那。

SQLite.CodeFirst项目地址:https://github.com/msallin/SQLiteCodeFirst

修改配置文件

引入System.Data.SQLite以后,项目内多出两个文件:

  1. App.config,这个文件是核心,配置数据库连接字符串,数据库相关配置,我们主要修改这个文件的内容。
  2. packages.config

修改App.config,具体为什么这么修,原因很简单,你只引入System.Data.SQLite,然后按照官网的三个命令依次跑一边,根据弹出的3-5个坑踩一遍就知道了,复制粘贴他不香吗?

第一步:完全复制下列代码,覆盖App.config中的内容

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <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"/>
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/>
  </startup>
  <entityFramework>
    <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.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.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"/></DbProviderFactories>
  </system.data>
	<connectionStrings>
		<add name="chishuiguo"
			connectionString="data source=chishuiguo.db;initial catalog=WpfApp2.Model1;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"
			providerName="System.Data.SQLite.EF6"/>
	</connectionStrings>
</configuration>

第二步:修改connectionStrings中的数据库连接字符串

只需要修改 name="chishuiguo" connectionString="data source=chishuiguo.db中的内容

  1. name是数据库连接字符串的别名,待会会用到。
  2. connectionString,你自己的数据库连接字符串,推荐直接按照博文内容chishuiguo.db,直接写数据名,这样操作最简单也安全便捷,你只需要将SQLite的数据库文件放到项目的bin文件同级目录即可(CodeFirst运行以后,创建的新表的数据库文件会出现在bin文件下)。
<connectionStrings>
    <add name="chishuiguo"
         connectionString="data source=chishuiguo.db;initial catalog=WpfApp2.Model1;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"
         providerName="System.Data.SQLite.EF6"/>
</connectionStrings>

创建Entity类

public class fh816db : DbContext
{
    //数据库连接字符串
    public fh816db():base("fishpond816"){}

    //很多人失败就是没有这个重写,这是SQLite.CodeFirst这个包的支持,有了这句才可以丝滑的CodeFirst
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        var sqliteConnectionInitializer = new SqliteCreateDatabaseIfNotExists<fh816db>(modelBuilder);
        Database.SetInitializer(sqliteConnectionInitializer);
    }

    //DbSet 通知 EF 哪些 C# 实体应映射到数据库。
    public DbSet<fish> fishs { get; set; }
}

//需要映射的实体
public class fish
{
    public int Id { get; set; }
    public string Varieties { get; set; }
}

创建表

其实到了第三步操作没问题,任务就结束了,因为引入了CodeFirst类库,所以会自动创建,第一次因为要做映射会慢一点,以后启动都很快,操作起来很简单,调用你的类库,然后F5让项目跑起来,这里做个抛砖引玉。

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        using (fh816db db =new fh816db())
        {
            fish fish = new fish { Varieties = "大鲨鱼" };
            db.fishs.Add(fish);
            db.SaveChanges();
        }
    }
}

到了这里基本的使用就完成了,如果要查看自己的表,到bin文件下面查看即可。

EF常用命令

  1. Install-Package EntityFramework ,已在项目“EasyWeChat.Data”中启用迁移。若要覆盖现有迁移配置,请使用 -Force 参数。

  2. Enable-Migrations, Code First 迁移.

  3. Add-Migration ,将检查自上次迁移后发生的更改,可以为迁移指定一个名称,将基于自上次迁移创建以来对模型所做的更改来构建下一次迁移.

  4. Update-Database ,将任何挂起的迁移应用到数据库.

其他模板

/// <summary>
/// 代码指定数据库连接
/// </summary>
/// <param name="existingConnection"></param>
/// <param name="contextOwnsConnection"></param>
public MyContext(DbConnection existingConnection, bool contextOwnsConnection) :
    base(existingConnection, contextOwnsConnection)
{
    ConfigurationFunc();
}

private void ConfigurationFunc()
{
    Configuration.LazyLoadingEnabled = true;
    Configuration.ProxyCreationEnabled = true;
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    var initializer = new SqliteDropCreateDatabaseWhenModelChanges<MyContext>(modelBuilder);
    Database.SetInitializer(initializer);
} 

报错处理

  1. No context type was found in the assembly ‘TestShell‘.

程序包管理器控制台,默认项目选择错误导致的

文章推荐:https://blog.****.net/haorenSW7/article/details/103636419

文章推荐:https://www.cnblogs.com/liujianshe1990-/p/13189083.html

  1. 具有固定名称“System.Data.SQLite”的 ADO.NET 提供程序未在计算机或应用程序配置文件中注册或无法加载。有关详细信息,请参阅内部异常。

文章推荐:https://blog.****.net/qq_35260798/article/details/106904924

  1. F5运行正常没有生成对应的数据库,使用对应的命令。

其他异常:报错的异常原封不动谷歌都会有结果,这里就不浪费时间了,一般出异常大概率是App.config问题,然后就是DbContext,这两个没问题基本都可以正常跑。

使用EF完成基于SQLite的CodeFirst

上一篇:MySQL DML语法 删除表中数据


下一篇:02 MySQL中的视图,存储过程/函数,触发器的基本知识点