C#结合DB4O数据库关联两类并正确输出关联类属性的实现方法
问题原因&解决方法
1. 首要问题:Course类未赋值+UI绑定逻辑问题
你当前的代码存在两个明显问题直接导致Course属性显示异常:
- 你创建Course实例时仅传入了
CourseCode参数,CourseName属性全程没有赋值,就算绑定逻辑正确也无法显示课程名称 - DataGridView绑定复杂类型属性时默认调用该类的
ToString()方法输出内容,你没有重写Course类的ToString(),因此默认输出类名。
解决步骤:
- 补全Course对象的初始化逻辑,优先复用数据库中已存在的Course对象,避免重复存储:
// 替换原有var course = new Course(comboBox_CourseCode.Text); 部分代码 var existCourse = dbStudent.Query<Course>(c => c.CourseCode == comboBox_CourseCode.Text).FirstOrDefault(); Course course; if (existCourse == null) { // 不存在对应课程则先创建存储课程对象,注意补全CourseName的取值 course = new Course(comboBox_CourseCode.Text, comboBox_Course.SelectedText/* 替换为你实际存储课程名称的控件值 */); dbStudent.Store(course); } else { course = existCourse; }
- 调整UI绑定逻辑,有两种可选方案:
- 方案A:重写Course类的ToString()方法,直接在Course类中添加以下代码,绑定后会自动输出格式化的课程信息:
public override string ToString() { return $"{CourseCode} {CourseName}"; }
- 方案B:如果需要将CourseCode和CourseName显示为两个独立列,查询后转匿名类再绑定:
// 在你给dataGridView赋值的位置(包括loadStudent方法内)做投影转换 var displayStudents = resultStudent.Select(s => new { s.StudentCode, s.LastName, s.FirstName, s.AdYear, s.BirthDate, s.Age, 课程编号 = s.Course.CourseCode, 课程名称 = s.Course.CourseName }).ToList(); dataGridView_Student.DataSource = displayStudents;
2. 潜在问题:DB4O激活深度不足
DB4O默认的激活深度较低,查询关联对象时可能不会自动加载嵌套属性的值,你可以全局配置激活深度保证关联属性正常读取:
// 初始化DB4O容器时添加配置 IEmbeddedConfiguration config = Db4oEmbedded.NewConfiguration(); config.Common.ActivationDepth = 3; // 激活深度设置为3,足够读取两层关联对象的属性 IObjectContainer db = Db4oEmbedded.OpenFile(config, "你的数据库文件路径");
内容的提问来源于stack exchange,提问作者Nhật Đoàn
相关产品推荐
相关产品推荐

