Avalonia 使用EFCore调用SQLite实现Singleton全局注册

这篇具有很好参考价值的文章主要介绍了Avalonia 使用EFCore调用SQLite实现Singleton全局注册。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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;
    }

}

其中包括:

  1. OnConfiguring 根据配置文件中的数据库地址设置数据库连接
  2. OnModelCreating 中设置实体类的主键
  3. ChangeConnection 方法实现切换数据库连接
  4. 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>());
}

其中:

  1. CreateDatabase方法的作用是初始化数据库,如果在指定的数据库文件地址中不存在文件,则在访问数据库时,SQLite 数据库引擎会尝试创建一个新的数据库文件。这意味着,如果指定的数据库文件地址没有文件,EF Core 与 SQLite 的集成会自动创建一个新的数据库文件。
  2. CheckTableExists 方法判断加载的数据库表是否完整

3.ChatDbcontext初始化和赋值

ChatDbcontext初始化和赋值在MainWindow_Loaded方法中,在首页加载时,判断配置中的数据库文件地址。并加载数据库。

4.DbContext的使用

如何在程序中使用DbContext来查询数据库是重点,下面是一些应用的场景:

代码如下:

//数据加载
            VMLocator.DataGridViewModel.ChatList=VMLocator.ChatDbcontext.ChatLists.ToObservableCollection();
            VMLocator.ChatViewModel.ChatHistory = VMLocator.ChatDbcontext.ChatMessages.ToObservableCollection();

这里查询数据库的记录赋值给DataGridViewModelChatViewModel,实现数据库的数据的加载。

简简单单的两行代码,完成了会话列表和聊天记录的数据加载。

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文章来源地址https://www.toymoban.com/news/detail-587858.html

到了这里,关于Avalonia 使用EFCore调用SQLite实现Singleton全局注册的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【sqlite3】sqlite3在linux下使用sqlitebrowser工具实现数据可视化

    1. ### install sqlitebrowser 安装指令 通过工具打开数据库 打开效果

    2024年02月01日
    浏览(35)
  • Avalonia中用FluentAvalonia+DialogHost.Avalonia实现界面弹窗和对话框

    本文是项目中关于 弹窗界面 设计的技术分享,通过 FluentAvalonia + DialogHost.Avalonia 开源nuget包来实现项目中需要 弹框显示的界面 和所有的 对话框 的展示。 效果如下: 本项目是基于Avalonia的GPT的AI会话项目。采用的是最新稳定版本 11.0.0-rc1.1 。希望通过该项目了解和学习Avalon

    2024年02月16日
    浏览(42)
  • Android Studio|使用SqLite实现一个简单的登录注册功能

    本学期学习了Android Studio这门课程,本次使用Android Studio自带的sqlite数据库实现一个简单的登录注册功能。 目录 一、了解什么是Android Studio? 二、了解什么是sqlite? 三、创建项目文件  四、创建活动文件和布局文件。 五、创建数据库,连接数据库  六、创建实体类,实现注

    2024年02月06日
    浏览(42)
  • Android使用SQLite数据库实现基本的增删改查

    目录 一、创建activity_main和MainActivity界面 二、实现查询/删除功能创建activity_delete和DeleteActivity 三、实现添加功能创建activity_add和AddActivity  四、实现更新功能创建activity_update和UpdateActivity 五、创建user_data类、userInfo类和增加权限 总结 activity_main如图:  MainActivity如下 layout界面

    2024年02月08日
    浏览(38)
  • Avalonia PathIcon使用

    PathIcon是一个Avalonia内置的控件,可以根据Geometry绘制一个图标。 PathIcon间接继承TemplatedControl,只有一个Geometry类型的依赖属性Data: 外观也很简单,一个Path,Data绑定PathIcon的属性Data,填充色绑定属性Foreground: 首先要创建Geometry,Avalonia UI Fluent Icons提供了一系列的图标集合,

    2024年02月02日
    浏览(27)
  • 使用Avalonia跨Linux平台

    Avalonia,读:阿瓦隆尼亚 这里的跨平台指的是,使用c#语言开发跨Linux平台。c#在Windows桌面开发中很强,但是在Linux桌面中,不能跨平台,Qt可以在Linux中跨平台,但是那是另外一门语言了。Avalonia类似使用WPF的技术方法来开发,所以,需要会使用WPF,其中的一些语法和写法与

    2023年04月08日
    浏览(25)
  • pycharm社区版使用SQLite连接数据库,并实现数据的增删改查

    社区版找不到数据库,需要先安装Database Navigator插件,之后才能通过sqlite3连接数据库。 ①文件 — ②设置 — ③插件 — ④Marketplace搜索database — ⑤安装Database Navigator — ⑥应用确定 安装之后就可以在页面左侧边栏找到DB Browser,也可以拖动移动到页面右侧。找不到的可以在视

    2024年01月17日
    浏览(40)
  • .net core 多项目中使用EFCore

    类库一级项目使用.net core 3.1 框架 其中EFCore是和数据库交互的 MultiCore 注入EFCore中的DBContext与数据库交互 主要为了解决多项目中数据库迁移失败问题 EFCore 工程安装如下包 MultiCore 安装如下 EFCore person.cs personconfig.cs EFDbcontext.cs EFDbContextFac .cs 这是关键,但是这仅仅在开发环境下

    2024年02月07日
    浏览(77)
  • 使用uniapp实现全局悬浮按钮(可拖动)

    效果如下 实现方案 使用uniapp官方组件 movable-area和movable-view 代码解析 在components新建一个xxx.vue组件 重点在于movable-area与movable-view需要分别增加pointer-events: none和pointer-events: auto用于组件事件穿透与恢复组件事件(此处不加会导致引用该组件的父组件无法使用事件) 组件代码

    2024年02月11日
    浏览(35)
  • 汇编调用C语言定义的全局变量

    在threadx移植中,系统的systick通过了宏定义的方式定义,很难对接库函数的时钟频率,不太利于进行维护 所以在C文件中自己定义了一个systick_Div的变量,通过宏定义方式设定systick的时钟频率 在汇编下要加载这个systick分频系数 方法: 总结:对汇编指令需要进一步熟悉。

    2024年02月15日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包