在C#跨平台桌面应用开发中,Avalonia是常用的UI框架,Entity Framework Core则是高效的ORM工具,将两者结合可以实现应用的本地数据持久化需求,无需额外搭建后端服务就能完成数据的增删改查操作。

环境准备与依赖安装
首先需要创建一个Avalonia应用项目,如果你已经存在现有项目可以直接使用。打开NuGet包管理器,安装以下两个核心依赖包:
- Microsoft.EntityFrameworkCore.Sqlite:用于SQLite数据库支持,适合桌面应用本地存储场景
- Microsoft.EntityFrameworkCore.Tools:用于执行数据库迁移相关命令
安装完成后,项目的依赖项会自动配置完成,无需额外修改项目文件的基础配置。
定义实体模型与数据库上下文
接下来需要定义业务对应的实体类,以及继承DbContext的数据库上下文类,这是EF Core操作数据库的核心部分。
实体类定义
假设我们要实现一个简单的用户管理功能,先定义User实体类:
using System.ComponentModel.DataAnnotations;
namespace AvaloniaEfDemo.Models
{
public class User
{
[Key]
public int Id { get; set; }
[Required]
[MaxLength(50)]
public string UserName { get; set; }
[Required]
[MaxLength(100)]
public string Email { get; set; }
public DateTime CreateTime { get; set; } = DateTime.Now;
}
}
数据库上下文定义
创建AppDbContext类,继承DbContext并配置数据库连接和实体集合:
using Microsoft.EntityFrameworkCore;
using AvaloniaEfDemo.Models;
namespace AvaloniaEfDemo.Data
{
public class AppDbContext : DbContext
{
public DbSet<User> Users { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
// 配置SQLite数据库连接,数据库文件会生成在项目运行目录下
optionsBuilder.UseSqlite("Data Source=app.db");
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// 可选:配置实体的额外规则,比如设置表名、字段约束等
modelBuilder.Entity<User>().ToTable("Users");
}
}
}
执行数据库迁移
定义完上下文后,需要通过EF Core的迁移命令生成数据库结构。打开程序包管理器控制台,依次执行以下命令:
# 添加迁移记录,InitialCreate是迁移名称,可以自定义 Add-Migration InitialCreate # 将迁移应用到数据库,生成实际的db文件 Update-Database
执行完成后,项目的运行目录下会出现app.db的SQLite数据库文件,表结构会按照我们定义的实体类自动生成。
在Avalonia中使用EF Core操作数据
接下来在Avalonia的ViewModel层或者Service层封装数据操作方法,然后在界面中调用这些方法完成数据交互。
封装数据服务
创建UserService类,封装用户的增删改查操作:
using AvaloniaEfDemo.Data;
using AvaloniaEfDemo.Models;
using System.Collections.Generic;
using System.Linq;
namespace AvaloniaEfDemo.Services
{
public class UserService
{
// 添加用户
public void AddUser(User user)
{
using (var db = new AppDbContext())
{
db.Users.Add(user);
db.SaveChanges();
}
}
// 获取所有用户
public List<User> GetAllUsers()
{
using (var db = new AppDbContext())
{
return db.Users.ToList();
}
}
// 根据Id删除用户
public void DeleteUser(int id)
{
using (var db = new AppDbContext())
{
var user = db.Users.FirstOrDefault(u => u.Id == id);
if (user != null)
{
db.Users.Remove(user);
db.SaveChanges();
}
}
}
}
}
界面数据绑定示例
在Avalonia的窗口中,我们可以通过按钮点击事件调用服务方法,然后将数据绑定到列表控件上。以下是一个简单的界面交互代码示例:
using Avalonia.Controls;
using AvaloniaEfDemo.Services;
using AvaloniaEfDemo.Models;
using System.Collections.ObjectModel;
using System.Linq;
namespace AvaloniaEfDemo.Views
{
public partial class MainWindow : Window
{
private ObservableCollection<User> _userList = new ObservableCollection<User>();
private UserService _userService = new UserService();
public MainWindow()
{
InitializeComponent();
// 初始化加载用户数据
LoadUsers();
// 假设界面有一个名为UserListView的ListBox控件
UserListView.ItemsSource = _userList;
}
private void LoadUsers()
{
var users = _userService.GetAllUsers();
_userList.Clear();
foreach (var user in users)
{
_userList.Add(user);
}
}
// 添加用户按钮点击事件
private void OnAddUserClick(object sender, Avalonia.Interactivity.RoutedEventArgs e)
{
var newUser = new User
{
UserName = "测试用户",
Email = "test@ipipp.com"
};
_userService.AddUser(newUser);
LoadUsers();
}
// 删除用户按钮点击事件
private void OnDeleteUserClick(object sender, Avalonia.Interactivity.RoutedEventArgs e)
{
if (UserListView.SelectedItem is User selectedUser)
{
_userService.DeleteUser(selectedUser.Id);
LoadUsers();
}
}
}
}
注意事项
- DbContext是轻量级对象,建议每次操作数据时创建新的实例,使用using语句确保资源释放,避免数据库连接占用问题
- 如果应用需要支持多用户同时操作,需要额外配置数据库并发控制,SQLite默认是单连接写入,多写入场景需要加锁处理
- 迁移命令执行时如果遇到上下文找不到的问题,需要确认AppDbContext的命名空间是否正确,或者手动指定迁移的上下文类型
- 生产环境中不建议将数据库连接字符串硬编码,可以通过配置文件读取,方便后续修改数据库路径或者切换数据库类型
通过以上步骤,就可以完成Avalonia和Entity Framework Core的集成,实现桌面应用的本地数据持久化功能,后续可以根据业务需求扩展更多实体和操作方法。
C#AvaloniaEntity_Framework_Core数据持久化修改时间:2026-06-21 06:06:33