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