UWP应用中学生-科目关联关系实现方案咨询
Hey there! Let me walk you through how to tackle this UWP task step by step, including core code snippets you can adapt directly.
实现UWP学生-科目关联展示方案
1. 定义数据模型与数据库上下文
We'll use Entity Framework Core to handle database operations first. Here are the entity classes and context setup:
// Student实体 public class Student { public int Id { get; set; } public string Name { get; set; } // 导航属性:关联的学生-科目记录 public ICollection<StudentSubject> StudentSubjects { get; set; } } // Subject实体 public class Subject { public int Id { get; set; } public string SubjectName { get; set; } // 导航属性:关联的学生-科目记录 public ICollection<StudentSubject> StudentSubjects { get; set; } } // 桥接表实体 public class StudentSubject { public int StudentId { get; set; } public Student Student { get; set; } public int SubjectId { get; set; } public Subject Subject { get; set; } } // 数据库上下文 public class SchoolDbContext : DbContext { public DbSet<Student> Students { get; set; } public DbSet<Subject> Subjects { get; set; } public DbSet<StudentSubject> StudentSubjects { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { // 配置本地SQLite数据库,可替换为其他数据库类型 optionsBuilder.UseSqlite("Data Source=SchoolDatabase.db"); } protected override void OnModelCreating(ModelBuilder modelBuilder) { // 配置桥接表的复合主键 modelBuilder.Entity<StudentSubject>() .HasKey(ss => new { ss.StudentId, ss.SubjectId }); // 配置Student与StudentSubject的一对多关系 modelBuilder.Entity<StudentSubject>() .HasOne(ss => ss.Student) .WithMany(s => s.StudentSubjects) .HasForeignKey(ss => ss.StudentId); // 配置Subject与StudentSubject的一对多关系 modelBuilder.Entity<StudentSubject>() .HasOne(ss => ss.Subject) .WithMany(s => s.StudentSubjects) .HasForeignKey(ss => ss.SubjectId); } }
2. 主页面:展示学生列表
The main page uses a ListView to display students and handles navigation to the details page on click:
XAML代码(MainPage.xaml)
<Grid> <ListView x:Name="StudentsListView" ItemClick="StudentsListView_ItemClick" IsItemClickEnabled="True"> <ListView.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding Name}" FontSize="18" Margin="10"/> </DataTemplate> </ListView.ItemTemplate> </ListView> </Grid>
后台代码(MainPage.xaml.cs)
public sealed partial class MainPage : Page { private SchoolDbContext _dbContext; public MainPage() { this.InitializeComponent(); _dbContext = new SchoolDbContext(); // 确保数据库已初始化创建 _dbContext.Database.EnsureCreated(); LoadStudents(); } private async void LoadStudents() { // 异步加载所有学生数据 var students = await _dbContext.Students.ToListAsync(); StudentsListView.ItemsSource = students; } private void StudentsListView_ItemClick(object sender, ItemClickEventArgs e) { var selectedStudent = e.ClickedItem as Student; if (selectedStudent != null) { // 导航到详情页,传递学生ID作为参数(比传整个对象更高效) Frame.Navigate(typeof(StudentSubjectsPage), selectedStudent.Id); } } }
3. 详情页面:展示学生关联的科目
Create a StudentSubjectsPage to receive the student ID and query their related subjects:
XAML代码(StudentSubjectsPage.xaml)
<Grid> <ListView x:Name="SubjectsListView"> <ListView.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding SubjectName}" FontSize="18" Margin="10"/> </DataTemplate> </ListView.ItemTemplate> </ListView> </Grid>
后台代码(StudentSubjectsPage.xaml.cs)
public sealed partial class StudentSubjectsPage : Page { private SchoolDbContext _dbContext; public StudentSubjectsPage() { this.InitializeComponent(); _dbContext = new SchoolDbContext(); } protected override async void OnNavigatedTo(NavigationEventArgs e) { base.OnNavigatedTo(e); if (e.Parameter is int studentId) { // 查询该学生关联的所有科目(使用Include加载关联数据,避免延迟加载问题) var studentSubjects = await _dbContext.StudentSubjects .Include(ss => ss.Subject) .Where(ss => ss.StudentId == studentId) .ToListAsync(); // 提取科目列表并绑定到ListView var subjects = studentSubjects.Select(ss => ss.Subject).ToList(); SubjectsListView.ItemsSource = subjects; } } }
关键注意事项
- Make sure to install required NuGet packages:
Microsoft.EntityFrameworkCore,Microsoft.EntityFrameworkCore.Sqlite,Microsoft.EntityFrameworkCore.Tools - Passing the student ID instead of the full object avoids serialization issues and is more efficient
- Using
Includeensures related subject data is loaded in a single query, preventing performance hits from lazy loading
内容的提问来源于stack exchange,提问作者hmak.soft
相关产品推荐
相关产品推荐

