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

畫卷琴夢
发布: 2025-12-17 12:59:56
原创
945人浏览过
在 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<appdbcontext>()</appdbcontext>:按需创建轻量 DbContext 实例,适合 UI 层调用
  • ⚠️ 避免 AddDbContext<appdbcontext>(ServiceLifetime.Scoped)</appdbcontext>:Avalonia 默认无“请求作用域”,手动管理易出错
  • ❌ 不要用 Singleton:DbContext 不是线程安全的,多线程并发写入会崩溃

示例(Program.cs):

var builder = AppBuilder.Configure<App>()
    .UsePlatformDetect()
    .LogToTrace();

builder.Services.AddDbContextFactory<AppDbContext>(options =>
    options.UseSqlite("Data Source=app.db")); // 可加 EnableSensitiveDataLogging 调试
登录后复制

3. 在 ViewModel 中安全使用 DbContext

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

Topaz Video AI
Topaz Video AI

一款工业级别的视频增强软件

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

示例(简化的 ViewModel):

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

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

    public ReactiveCommand<object?, Unit> LoadUsersCommand { get; }

    private async Task LoadUsersAsync()
    {
        using var ctx = await _factory.CreateDbContextAsync();
        var list = await ctx.Users.ToListAsync();
        Users = new ObservableCollection<User>(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 就能稳定协作。

以上就是C# Avalonia如何集成Entity Framework Core Avalonia EF Core教程的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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