使用EF完成基于SQLite的CodeFirst
操作流程
引用类库
-
System.Data.SQLite,这个类库是SQlite的核心支持,使用别的ORM框架也需要,例如:LINQ2DBSQLite
-
SQLite.CodeFirst,EF本身不支持SQLite的CodeFirst模式,这是一个大佬做的封装,引入以后,只需要做少部分修改,就可以丝滑的支持CodeFirst.虽然只引入System.Data.SQLite也可以使用,但是引入SQLite.CodeFirst更丝滑,省事,谁会不喜欢他那。
SQLite.CodeFirst项目地址:https://github.com/msallin/SQLiteCodeFirst
修改配置文件
引入System.Data.SQLite以后,项目内多出两个文件:
- App.config,这个文件是核心,配置数据库连接字符串,数据库相关配置,我们主要修改这个文件的内容。
- 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
中的内容
- name是数据库连接字符串的别名,待会会用到。
- 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常用命令
-
Install-Package EntityFramework ,已在项目“EasyWeChat.Data”中启用迁移。若要覆盖现有迁移配置,请使用 -Force 参数。
-
Enable-Migrations, Code First 迁移.
-
Add-Migration ,将检查自上次迁移后发生的更改,可以为迁移指定一个名称,将基于自上次迁移创建以来对模型所做的更改来构建下一次迁移.
-
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);
}
报错处理
No context type was found in the assembly ‘TestShell‘.
程序包管理器控制台,默认项目选择错误导致的
文章推荐:https://blog.****.net/haorenSW7/article/details/103636419
文章推荐:https://www.cnblogs.com/liujianshe1990-/p/13189083.html
- 具有固定名称“System.Data.SQLite”的 ADO.NET 提供程序未在计算机或应用程序配置文件中注册或无法加载。有关详细信息,请参阅内部异常。
文章推荐:https://blog.****.net/qq_35260798/article/details/106904924
- F5运行正常没有生成对应的数据库,使用对应的命令。
其他异常:报错的异常原封不动谷歌都会有结果,这里就不浪费时间了,一般出异常大概率是App.config问题,然后就是DbContext,这两个没问题基本都可以正常跑。