论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
软件与程序人生
›
后端开发
›
Java
›
Avalonia 使用EFCore调用SQLite实现Singleton全局注册 ...
Avalonia 使用EFCore调用SQLite实现Singleton全局注册
渣渣兔
金牌会员
|
2023-7-20 21:20:00
|
显示全部楼层
|
阅读模式
楼主
主题
881
|
帖子
881
|
积分
2643
Avalonia 使用EFCore调用SQLite实现Singleton全局注册
本篇博客是我的开源项目
TerraMours.Chat.Ava
的更新的记录分享,本次更新使用
EntityFrameWork Core
调用SQLite,实现数据的本地化和查询的优化,删除了
dbpross
类(直接调用SQLite的操作类)。大大提高了代码的简洁度和易读性。通过全局注册的
ChatDbcontext
对象,是操作数据库变的非常方便。对项目感兴趣的同学可以到github上搜索
TerraMours.Chat.Ava
。希望通过该项目了解和学习Avalonia开发的朋友可以在我的github上拉取代码,同时希望大家多多点点star。
https://github.com/raokun/TerraMours.Chat.Ava
项目的基础通用功能和业务代码开发
在之前博客中介绍过了,想了解的同学跳转学习:
基于Avalonia 11.0.0+ReactiveUI 的跨平台项目开发1-通用框架
基于Avalonia 11.0.0+ReactiveUI 的跨平台项目开发2-功能开发
了解Avalonia创建模板项目-基础可跳转:
创建Avalonia 模板项目-基础
本次我主要分享的内容是项目中使用EFCore调用SQLite的实现。
1.安装nuget包
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.0-preview.6.23329.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.0-preview.6.23329.4">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>
复制代码
2.创建一个继承自 DbContext 的类
创建
ChatDbcontext
继承自 DbContext 的类,并在构造函数中将连接字符串传递给 DbContextOptions 对象。
代码如下:
public class ChatDbcontext :DbContext{
public DbSet<ChatMessage> ChatMessages { get; set; }
public DbSet<ChatList> ChatLists { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder options)
=> options.UseSqlite($"Data Source={AppSettings.Instance.DbPath}"); // 这里是您的 SQLite 连接字符串
protected override void OnModelCreating(ModelBuilder modelBuilder) {
// 添加实体配置
modelBuilder.Entity<ChatMessage>().HasKey(e => e.ChatRecordId);
modelBuilder.Entity<ChatList>().HasKey(e => e.Id);
base.OnModelCreating(modelBuilder);
}
//切换数据库连接
public void ChangeConnection(string connectionString) {
// 修改数据库连接字符串,并重新配置 DbContext
Database.GetDbConnection().ConnectionString = connectionString;
ChangeTracker.AutoDetectChangesEnabled = false;
ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
ChangeTracker.AutoDetectChangesEnabled = true;
}
/// <summary>
/// 检查表是否存在
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public bool CheckIfTableExists<T>() where T : class {
var tableExists = this.Model.FindEntityType(typeof(T)) != null;
return tableExists;
}
}
复制代码
其中包括:
OnConfiguring
根据配置文件中的数据库地址设置数据库连接
OnModelCreating
中设置实体类的主键
ChangeConnection
方法实现
切换数据库连接
CheckIfTableExists
方法
检查指定的表是否存在
3.DbContext 注册为全局服务
1.创建一个静态字段
VMLocator类中,创建一个静态字段来保存 DbContext 的实例
代码如下:
private static ChatDbcontext _chatDbcontext;
public static ChatDbcontext ChatDbcontext {
get => (_chatDbcontext ??= new ChatDbcontext());
set => _chatDbcontext = value;
}
复制代码
2.创建ChatProcess数据库操作类
代码如下:
/// <summary>
/// 创建并初始化数据库
/// </summary>
public void CreateDatabase() {
using (var context = new ChatDbcontext()) {
context.Database.Migrate();
VMLocator.ChatDbcontext = context;
}
}
/// <summary>
/// 判断加载的数据库表是否完整
/// </summary>
public async Task<bool> CheckTableExists(string selectedFilePath) {
VMLocator.ChatDbcontext.ChangeConnection(selectedFilePath);
return (VMLocator.ChatDbcontext.CheckIfTableExists<ChatMessage>() && VMLocator.ChatDbcontext.CheckIfTableExists<ChatList>());
}
复制代码
其中:
CreateDatabase
方法的作用是
初始化数据库
,如果在指定的数据库文件地址中不存在文件,则在访问数据库时,SQLite 数据库引擎会尝试创建一个新的数据库文件。这意味着,如果指定的数据库文件地址没有文件,EF Core 与 SQLite 的集成会
自动创建
一个新的数据库文件。
CheckTableExists
方法
判断加载的数据库表是否完整
3.ChatDbcontext初始化和赋值
ChatDbcontext
初始化和赋值在
MainWindow_Loaded
方法中,在首页加载时,判断配置中的数据库文件地址。并加载数据库。
4.DbContext的使用
如何在程序中使用DbContext来查询数据库是
重点
,下面是一些应用的场景:
代码如下:
//数据加载
VMLocator.DataGridViewModel.ChatList=VMLocator.ChatDbcontext.ChatLists.ToObservableCollection();
VMLocator.ChatViewModel.ChatHistory = VMLocator.ChatDbcontext.ChatMessages.ToObservableCollection();
复制代码
这里查询数据库的记录赋值给
DataGridViewModel
和
ChatViewModel
,实现数据库的数据的加载。
简简单单的两行代码,完成了会话列表和聊天记录的数据加载。
ToObservableCollection扩展
我们需要把数据库查询的数据转换成
ObservableCollection
的集合做
Binding
,我们写一个EF的扩展方法来实现这个转换。
代码如下:
/// <summary>
/// 扩展方法
/// </summary>
public static class ObservableCollectionExtensions {
public static ObservableCollection<T> ToObservableCollection<T>(this IEnumerable<T> source) {
return new ObservableCollection<T>(source);
}
}
复制代码
更多的使用方法可以在代码中查看
TerraMours.Chat.Ava
5.生成数据迁移文件
执行
Add-Migration
命令
Add-Migration Init0720
复制代码
由于我们在
CreateDatabase
代码里实行了数据库的更新,所以我们在这里不需要执行Update-Database 命令
值得注意的是,我们在修改过字段后,一定要执行Add-Migration 命令生成数据迁移文件,这是数据库初始化和更新的基础
6.总结
通过EF core 等ORM框架操作数据库为我们开发项目时提供了便捷。在不追求极限的速度的前提下,使用EntityFrameWork来做查询真的很方便。
通过ChatDbcontext来操作数据库,让开发变的简单。希望看完后能给大家带来帮助。
目前程序还没有完全开发完成。后续的开发我会及时跟进。阅读如遇样式问题,请前往个人博客浏览:
https://www.raokun.top
目前web端ChatGPT:
https://ai.terramours.site
当前开源项目地址:
https://github.com/raokun/TerraMours.Chat.Ava
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
正序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
发新帖
回复
渣渣兔
金牌会员
这个人很懒什么都没写!
楼主热帖
SqlServer2012升级到SqlServer2016
事务的ACID特性
深度干货!一篇Paper带您读懂HTAP | St ...
DCM: 中间件家族迎来新成员
iOS事件传递链与响应链
SaaS软件工程师成长路径
(内附源码)Node.js小试——使用Node ...
还在纠结报表工具的选型么?来看看这个 ...
.NET for Apache Spark 入门演练
Java后端05(初识MyBatis)
标签云
存储
服务器
快速回复
返回顶部
返回列表