使用Telerik库遍历数据库对象时出现voa_class相关异常该如何解决?
异常产生原因
你遇到的voa_class相关报错是Telerik OpenAccess ORM的典型映射异常:voa_class是OpenAccess自动维护的系统字段,用于标识数据库表中每一行数据对应继承层级中的具体实体类型。报错本质是你Class1对应的数据库表中,存在某行数据的voa_class字段值不在Class1的继承映射体系范围内,可能的触发场景包括:
- 你手动往表中插入了数据,没有正确填写
voa_class字段值 Class1的继承映射配置做过修改,但没有同步更新数据库架构- 表中存在
Class1的父类/其他子类对应的数据行,你直接查询Class1时ORM识别到类型不匹配
你的两次写法触发报错的原因一致:两种逻辑都会触发ORM拉取表中第二行数据,恰好该行的voa_class值不符合Class1的映射规则,和你写的取数逻辑本身没有关系。
解决方案
优先排查修正数据/映射问题
打开Class1对应的数据库表,核对所有行的voa_class字段取值,和你项目中OpenAccess的实体继承映射配置做比对,删除/修正取值不匹配的行;如果是映射配置修改后未同步数据库,运行OpenAccess的架构更新工具同步映射和表结构即可。修正取数逻辑的潜在问题
你第二次尝试的排序逻辑是无效的:IQueryable的链式调用会返回新的查询对象,你没有把排序后的结果赋值回query,排序规则不会生效,Skip(1)的返回结果是不确定的,正确写法如下:
IQueryable<Class1> query = database.GetData<Class1>(); query = query.OrderBy(u => u.Id); // 要把排序后的查询赋值回去 var Obj1 = query.First(); var Obj2 = query.Skip(1).First();
如果你只需要查询Class1对应的数据,也可以在查询时显式添加过滤条件,过滤掉类型不匹配的行即可。
内容的提问来源于stack exchange,提问作者Dominique
相关产品推荐
相关产品推荐

