使用EF6连接Sqlite

1、前置条件
安装以下包

EntityFramework
System.Data.Sqlite

以上包会自动生成或填充Config文件
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>
	<connectionStrings>
		<add name="Sqlite" connectionString="data source=E:\CSharp Project\ApplyClient\IgniteApp\IgniteShared\Db\demo.db;;version=3;" providerName="System.Data.SQLite.EF6"/>
	</connectionStrings>
  <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>
</configuration>

2、包安装完成后实现代码

 public class AccessDbContext : DbContext
 {
     public DbSet<MaterialInfo> MaterialInfos { get; set; }
     public AccessDbContext() : base("Sqlite")
     {

     }
 }

注意1、

 public AccessDbContext() : base("Sqlite")
 {

 }

构造器中Sqlite指的是

ConfigurationManager.ConnectionStrings["Sqlite"].ConnectionString;

它是默认读取出来的,你需要填写Config文件中connectionStrings的name
注意2、
此时Sqlite的控制权会在ADO和EF6 ORM框架之间争夺,所以程序会报错,
因为我们安装了EF6,所以
所以不需要你手动写SqliteCommand之类的东西,但是你必须
将控制权全权交给EF6去控制

System.InvalidOperationException:“No Entity Framework provider found for the ADO.NET provider with invariant name 'System.Data.SQLite'. Make sure the provider is registered in the 'entityFramework' section of the application config file. See http://go.microsoft.com/fwlink/?LinkId=260882 for more information.”

System.Data.SQLite.EF6:

这是专门为EF6设计的SQLite数据提供程序。
它告诉EF6如何处理SQLite数据库连接。
System.Data.SQLite:

这是通用的SQLite数据提供程序标识符。
即使你使用的是EF6,EF6仍然需要知道如何处理通用的System.Data.SQLite标识符。
这是因为EF6依赖于ADO.NET的数据提供程序系统,而System.Data.SQLite是ADO.NET系统中定义的标识符。
所以你的Config文件必须两个都写

 <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" />

3、打开Navicat
导入Config目录下的db文件
新建表
实现代码

  AccessDbContext _dbContext = new AccessDbContext();
  var info=new MaterialInfo();
  info.Id = 1;
  info.Name="test";
  _dbContext.MaterialInfos.Add(info);
  _dbContext.SaveChanges();//保存缓存操作
  var ListRes = _dbContext.MaterialInfos.Where(t => t.Name == "test").ToList();

4、你觉得自己新建表新建数据库太慢了
此时你需要一个新的包
SQLite.CodeFirst
它的功能是自动创建数据库,自动创建表
这个时候,你需要继续修改Config文件

<connectionStrings>
	<add name="Sqlite" connectionString="data source=demo.db;version=3;" providerName="System.Data.SQLite.EF6"/>
</connectionStrings>

然后使用SQLite.CodeFirst

 public class AccessDbContext : DbContext
 {
     public DbSet<MaterialInfo> MaterialInfos { get; set; }
     public AccessDbContext() : base("Sqlite")
     {

     }
     protected override void OnModelCreating(DbModelBuilder modelBuilder)
     {
         var sqliteConnectionInitializer = new SqliteCreateDatabaseIfNotExists<AccessDbContext>(modelBuilder);
         Database.SetInitializer(sqliteConnectionInitializer);
     }
 }

修改Config的作用是,SQLite.CodeFirst会在你程序的bin目录下自动生成demo.db(你起的名称)
如果写成路径,程序不会报错,但是不会自动生成数据库和表
5、当然,你也可以使用SQLite.CodeFirst自动填充数据

 // 自定义数据库初始化器
 public class MyDbContextInitializer : SqliteDropCreateDatabaseAlways<AccessDbContext>
 {
     public MyDbContextInitializer(DbModelBuilder modelBuilder)
         : base(modelBuilder) { }

     protected override void Seed(AccessDbContext context)
     {
         // 在这里填充核心数据或测试数据
         context.Set<MaterialInfo>().Add(new MaterialInfo { Name = "John Doe", Id = 30 });
         context.SaveChanges();
     }
 }
 internal class Program
{
    static void Main(string[] args)
    {
        Database.SetInitializer(new MyDbContextInitializer(new DbModelBuilder()));
        AccessDbContext _dbContext = new AccessDbContext();
        var info=new MaterialInfo();
        info.Id = 1;
        info.Name="test";
        for (var i = 0; i < 10; i++)
        {

            new MaterialInfo
            {
                Name = "小李",
                Id = i,

            };
        }
        _dbContext.MaterialInfos.Add(info);
         _dbContext.SaveChanges();//保存缓存操作

        var ListRes = _dbContext.MaterialInfos.Where(t => t.Name == "test").ToList();

        Console.WriteLine("-----完成---");
    }
}
posted @ 2024-10-31 21:36  孤沉  阅读(62)  评论(0编辑  收藏  举报