首页 > 数据库 >使用EF6连接Sqlite

使用EF6连接Sqlite

时间:2024-10-31 21:32:12浏览次数:1  
标签:Sqlite SQLite AccessDbContext public EF6 new 连接

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("-----完成---");
    }
}

标签:Sqlite,SQLite,AccessDbContext,public,EF6,new,连接
From: https://www.cnblogs.com/guchen33/p/18518933

相关文章

  • Navicat 连接 MySQL 失败:2002-can‘t connect to server on localhost(10061)问题解决
    连接不上问题可能有如下原因服务器安全组中没有配置3306端口mysql服务端口只开放本地了如下:修改/etc/mysql/mysql.conf.d/mysqld.cnf中bind-address和mysqlx-bind-address注释掉重启mysql服务systemctlrestartmysqlmysql登录用户的host为localhost只允......
  • DVD管理系统 (连接数据库--项目模拟)
    本章主要是增加和查看功能,其他的删除和修改(借出/归还)只是写了工具类和接口DVD类属性----必须与数据库里面,我们所调用的表一一对应!!!!packagedvd.entry;/***实体类---一对一参照表*表名=类名(首字母大写)*字段名===属性名*字段类型==属性类型*/publicclas......
  • Python SQLite数据库编程
    Python内置 SQLite库直接使用,简单,适合初学者。做更复杂软件,建议重新选用数据库从例子开始:示例代码:#导入模块importsqlite3#连接数据库,返回连接对象conn=sqlite3.connect("D:/my_test.db")#调用连接对象的execute()方法,执行SQL语句#(此处执行的是DDL语句,创......
  • nltest 是一个 Windows 命令行工具,用于测试和管理 Windows 域的信任和连接状态。以下
    Nltest|MicrosoftLearnnltest是一个Windows命令行工具,用于测试和管理Windows域的信任和连接状态。以下是一些常用的nltest命令示例:1.查询域信任关系bashCopyCodenltest/domain_trusts该命令显示当前计算机与其域和其他信任域之间的信任关系。2.验证域控制器b......
  • 揭秘!SpringBoot与MongoDB连接池配置,高效数据库操作的秘密武器
    在SpringBoot中整合MongoDB并配置连接池,可以通过以下步骤实现。我们将使用SpringDataMongoDB来简化与MongoDB的交互,并配置连接池以提高性能和资源利用率。一、添加依赖首先,在你的pom.xml文件中添加必要的依赖:<dependencies><!--SpringBootStarterDataMongoDB-......
  • 达梦客户端/idea连接达梦/达梦导出
    达梦自带的工具导出非常有缺陷大问题,所以使用idea连接达梦进行导出 一,下载达梦jdbc驱动达梦官网产品下载|达梦数据库(dameng.com)     二,idea添加driver在IntelliJIDEA中连接达梦数据库,可以按照以下步骤进行操作:1.打开IntelliJIDEA,进入项目。2.......
  • vscode 远程连接报错,“Resolver error: Error: XHR failed”
    [11:06:53.461]Creatingbashsubshellinside"bash"[11:06:53.560]>bashversion:4.4.20(1)-release[11:06:53.586]>bashversion:4.4.20(1)-release[11:06:53.717]>c448906b72f1:running[11:06:53.783]>Acquiringlockon/root/.......
  • ChinaDX:中国联通助力,轻松实现AWS跨境连接
    一、服务概述ChinaDX,即中国联通提供的AWS跨境直连服务(ChinaUnicomChinaCross-borderDirectConnectionService),是一项专为企业客户设计的云互联解决方案。该服务通过快速连接、高性能、安全、灵活的特性,助力企业提升在AWS云上的生产力,实现业务的全球化拓展。二、产品优势......
  • 数据库的连接过程
    首先新建lib包将mysql的jar文件复制进去随后右键lib将其添加到库随后添加代码运行成功说明连接成功,再测试添加数据数据库中出现添加的数据说明添加成功,数据库连接成功......
  • 内连接、左连接、右连接
    ‌1.内连接(InnerJoin)‌:    作用:返回两个表中联结字段相等的数据。    特点:只显示两个表中匹配的记录,不显示不匹配的记录。SELECT*FROMtable1INNERJOINtable2ONtable1.common_field=table2.common_field。‌‌2.左连接(LeftJoin)‌:    作用:返回左表的......