【C#】使用EF访问Sqlite数据库
1. 先上Nuget下载对应的包
如图,搜索System.Data.SQLite下载安装即可,下载完之后带上依赖一共有这么几个:
- EntityFramework
- System.Data.SQLite
- System.Data.SQLite.Core
- System.Data.SQLite.EF6
- System.Data.SQLite.Linq
安装完成后,会添加App.config文件(如果没有的话),里面添加了一些provider的配置。
2. 先看下DB First模式
如果你用的是VS2017的话,很不幸无法通过“ADO.NET实体数据模型”来生成edmx文件。如果用VS2015及之前版本的话可以去官网下载一个插件,安装之后就可以用了。这里以VS2017为例:
1. 首先,在App.config中配置数据库连接字符串:
<connectionStrings> <add name="SqliteTest" connectionString="Data Source=E:\retail.db" providerName="System.Data.SQLite.EF6" /> </connectionStrings>
2.然后就可以 编写数据库上下文和实体了,然后就可以用了
public class RetailContext : DbContext { public RetailContext(): base("SqliteTest"){} public DbSet<Thumbnail> Thumbnails { set; get; } } public class Thumbnail { public Int64 Id { get; set; } [Required] [Unique] public string OrginFilePath { get; set; } [Required] public string ThumbnailPath { get; set; } [Required] public DateTime LastUpdateTime { get; set; } }
不过在运行过程中你可能会遇到这个错误SQLite error of “Unable to find the requested .Net Framework Data Provider.
解决方法就是在App.config的providers
中添加以下节点
<provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
完整的如下:
<providers> <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" /> <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> <!-- 1. Solves SQLite error of "Unable to find the requested .Net Framework Data Provider."--> <provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" /> </providers>
从上面的代码可以看到数据库的路径是写死的不能改变,这样就很不灵活。我喜欢可以动态连接的数据库,所以再次修改:
我们知道DbContext
这个类有几个构造函数,一个是接收string
类型的connectionString
,一般都用的是这个。还有一个构造函数是接收一个DbConnection
类型参数和bool
类型的参数。这个构造函数就可以实现我们的要求:
- 首先,构造一个
DbConnection
类:DbConnection sqliteCon = SQLiteProviderFactory.Instance.CreateConnection();
- 然后,给这个对象设置
ConnectionString
:sqliteCon.ConnectionString = dbPath;
-
最后,把这个对象传给
DbContext
即可。如下:
public class ThumbnailContext : DbContext { static string dbPath = $"Data Source=E:\\thumbnail.db"; public static ThumbnailContext Instance { get { DbConnection sqliteCon = SQLiteProviderFactory.Instance.CreateConnection(); sqliteCon.ConnectionString = dbPath; return new ThumbnailContext(sqliteCon); } } private ThumbnailContext(DbConnection con) : base(con, true) { } public DbSet<Thumbnail> Thumbnails { get; set; } }
3. CodeFirst模式
Sqlite默认不支持CodeFirst模式,如果用户因为某些操作删除了我们的db文件,此时我们的程序就不能正常工作了,是不是有点尴尬?不过还是有解决办法的,在Nuget里搜索SQLite.CodeFirst
安装即可。
然后重写DbContext
的OnModelCreating
方法。这里是修改后的数据库上下文:
public class ThumbnailContext : DbContext { static string dbPath = $"Data Source={PathManager.AppDataTempThumbnail}\\thumbnail.db"; public static ThumbnailContext Instance { get { DbConnection sqliteCon = SQLiteProviderFactory.Instance.CreateConnection(); sqliteCon.ConnectionString = dbPath; return new ThumbnailContext(sqliteCon); } } private ThumbnailContext(DbConnection con) : base(con, true) { } protected override void OnModelCreating(DbModelBuilder modelBuilder) { //如果不存在数据库,则创建 Database.SetInitializer(new SqliteCreateDatabaseIfNotExists<ThumbnailContext>(modelBuilder)); } public DbSet<Thumbnail> Thumbnails { get; set; } }
4.一些优化
在使用过程中你可能会察觉到,每当第一次访问数据库(查询、插入等)时总是会慢一点,可能有1秒的时间数据库才会做出响应,然后接下再操作就很快。
这是因为当你第一次访问数据库时,EF需要在内存中建立实体与数据库表的映射关系,这个操作需要点时间。所以在你的程序一启动的时候就要把关系给映射好。
这里以上面的ThumbnailContext
为例,首先new一个对象,假设为dbContext
。然后在你整个应用程序的入口点调用下述代码:
public void Init() { //Pre-Generated Mapping Views var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext; var mappingCollection = (StorageMappingItemCollection)objectContext.MetadataWorkspace.GetItemCollection(DataSpace.CSSpace); mappingCollection.GenerateViews(new List<EdmSchemaError>()); }
后记:通过EF来访问Sqlite数据库,我也使用了有一段时间了,但是有时候会出现几个莫名奇妙的问题,而且还不太好定位,不知道是不是EF和Sqlite不太兼容的问题。现在尝试改为用ADO.NET来访问,于是就有了接下来的这篇文章:【C#】使用ADO.NET访问Sqlite数据库,SqliteHelper帮助类。
参考链接:

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
【C#】wpf添加gif动图支持
原文: 【C#】wpf添加gif动图支持 1.nuget里下载XamlAnimatedGif包,然后安装。 2.添加XamlAnimatedGif包的命名空间:xmlns:gif="https://github.com/XamlAnimatedGif/XamlAnimatedGif" 3.开始使用: <Image gif:AnimationBehavior.SourceUri="{StaticResource loading.gif}" Width="200" Height="20"></Image> 主要的就是把AnimatedSource设置为你的gif动画。 注意nuget库里还有个显示gif的包:WpfAnimatedGif。不建议使用这个,会导致内存泄露,最后程序崩溃。
- 下一篇
【C#】WixToolset快速入门教程
原文: 【C#】WixToolset快速入门教程 介绍 给windows系统做软件,常见的打包工具大家可能都听说过,如:大名鼎鼎的Installshield、Inno setup等。在遇见Wix之前InstallShield时我的主力打包工具,操作简单方便项目使用到的dll文件会自动添加,多语言支持也很好,不过不好的是免费版的功能就那几样,越来越无法满足自己的要求。后来就尝试了下Inno setup,这个是用脚本进行配置并生成安装包的,简单尝试之后发现实在麻烦还不好配置,于是就放弃了。再后来就遇到了WixToolSet,这个瑞士军刀一样的打包工具还是免费开源的,已经与VS整合到了一起,安装界面还可以根据WPF一样的xaml标签自定义样式,很是不错,但是国内教程较少而且有些说的也不是很清楚,学起来比较有难度。 之前的老项目升级了,打包时发现wix的打包流程又忘记了,所以这篇教程给自己提个醒,也就给大家带来了一个简单的快速入门教程。 要求 一个winform做的程序: 可以自定义安装位置 升级包可覆盖安装,不允许降级安装 桌面和开始菜单有启动/卸载的快捷方式 支持中文 开始 1.wix安装...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Mario游戏-低调大师作品
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS7安装Docker,走上虚拟化容器引擎之路