0

0

C# Avalonia如何集成Entity Framework Core Avalonia EF Core教程

畫卷琴夢

畫卷琴夢

发布时间:2025-12-17 12:59:56

|

945人浏览过

|

来源于php中文网

原创

在 Avalonia 中集成 EF Core 可行,关键在于异步操作、DI 注入 DbContextFactory 及正确管理生命周期;需避免 UI 线程阻塞,推荐用 AddDbContextFactory 而非 Scoped 或 Singleton 注册。

c# avalonia如何集成entity framework core avalonia ef core教程

在 Avalonia 中集成 Entity Framework Core 是可行的,但需注意:EF Core 本身是平台无关的数据访问层,不依赖 UI 框架;而 Avalonia 是跨平台 UI 框架,二者可自然协作——关键在于避免在 UI 线程直接执行耗时的 EF Core 操作(如 SaveChanges、Linq 查询),并合理管理 DbContext 生命周期。

1. 安装必要 NuGet 包

在 Avalonia 应用项目(通常是 .csproj 文件所在项目)中添加以下包:

  • Microsoft.EntityFrameworkCore.Sqlite(或 SqlServer/PostgreSQL 等对应提供程序)
  • Microsoft.EntityFrameworkCore.Tools(仅开发期需要,用于迁移命令)
  • (可选)Avalonia.ReactiveUIAvalonia.Xaml.Behaviors,便于配合异步数据绑定

2. 配置 DbContext 并注册为服务

推荐在 Program.cs 或应用启动类中使用 Avalonia 的 DI 容器注册 DbContext。注意选择合适的生命周期:

  • ✅ 推荐 AddDbContextFactory():按需创建轻量 DbContext 实例,适合 UI 层调用
  • ⚠️ 避免 AddDbContext(ServiceLifetime.Scoped):Avalonia 默认无“请求作用域”,手动管理易出错
  • ❌ 不要用 Singleton:DbContext 不是线程安全的,多线程并发写入会崩溃

示例(Program.cs):

var builder = AppBuilder.Configure()
    .UsePlatformDetect()
    .LogToTrace();

builder.Services.AddDbContextFactory(options =>
    options.UseSqlite("Data Source=app.db")); // 可加 EnableSensitiveDataLogging 调试

3. 在 ViewModel 中安全使用 DbContext

ViewModel 应通过构造函数接收 IDbContextFactory,并在 async 方法中创建并释放上下文:

Quinvio AI
Quinvio AI

AI辅助下快速创建视频,虚拟代言人

下载
  • 所有数据库操作(查询、增删改)必须标记为 async,并在 await 后更新 UI 绑定属性
  • using var ctx = await _factory.CreateDbContextAsync(); 确保及时释放
  • 若需响应式刷新(如列表变化),搭配 ReactiveUI 的 ObservableAsPropertyHelper 或 Avalonia 的 NotifyPropertyChanged 特性

示例(简化的 ViewModel):

public partial class MainWindowViewModel : ViewModelBase
{
    private readonly IDbContextFactory _factory;
    private ObservableCollection _users = new();
    
    public ObservableCollection Users
    {
        get => _users;
        private set => this.RaiseAndSetIfChanged(ref _users, value);
    }

    public MainWindowViewModel(IDbContextFactory factory)
    {
        _factory = factory;
        LoadUsersCommand = ReactiveCommand.CreateFromTask(LoadUsersAsync);
    }

    public ReactiveCommand LoadUsersCommand { get; }

    private async Task LoadUsersAsync()
    {
        using var ctx = await _factory.CreateDbContextAsync();
        var list = await ctx.Users.ToListAsync();
        Users = new ObservableCollection(list);
    }
}

4. 处理迁移与首次初始化

EF Core 迁移命令(如 dotnet ef migrations add Init)与 Avalonia 无关,照常在项目目录下运行即可。但应用首次启动时,建议自动检查并迁移:

  • App.OnFrameworkInitializationCompleted() 或主窗口构造后,调用一次 MigrateAsync()
  • 注意:该操作也必须异步 + UI 线程调度保护(可用 Dispatcher.UIThread.InvokeAsync 封装)
  • SQLite 场景下,可先检查文件是否存在再决定是否迁移

示例片段:

private async Task EnsureDatabaseCreatedAsync()
{
    using var ctx = await _factory.CreateDbContextAsync();
    await ctx.Database.MigrateAsync(); // 自动执行待处理迁移
}

不复杂但容易忽略:DbContext 不是 UI 组件,它只管数据;Avalonia 只负责展示和交互。把二者串起来的核心,是用好异步 + DI + 明确作用域。做好这三点,EF Core 和 Avalonia 就能稳定协作。

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

482

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

143

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

5

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

11

2026.01.21

postgresql常用命令
postgresql常用命令

postgresql常用命令psql、createdb、dropdb、createuser、dropuser、l、c、dt、d table_name、du、i file_name、e和q等。本专题为大家提供postgresql相关的文章、下载、课程内容,供大家免费下载体验。

158

2023.10.10

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

976

2023.11.02

postgresql常用命令有哪些
postgresql常用命令有哪些

postgresql常用命令psql、createdb、dropdb、createuser、dropuser、l、c、dt、d table_name、du、i file_name、e和q等。更详细的postgresql常用命令,大家可以访问下面的文章。

197

2023.11.16

postgresql常用命令介绍
postgresql常用命令介绍

postgresql常用命令有l、d、d5、di、ds、dv、df、dn、db、dg、dp、c、pset、show search_path、ALTER TABLE、INSERT INTO、UPDATE、DELETE FROM、SELECT等。想了解更多postgresql的相关内容,可以阅读本专题下面的文章。

268

2023.11.20

菜鸟裹裹入口以及教程汇总
菜鸟裹裹入口以及教程汇总

本专题整合了菜鸟裹裹入口地址及教程分享,阅读专题下面的文章了解更多详细内容。

0

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 4万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

React核心原理新老生命周期精讲
React核心原理新老生命周期精讲

共12课时 | 1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号