ASP.NET MVC中Kendo UI Grid添加外键表后无法绑定加载数据问题
问题排查与解决步骤
排查流程
- 打开浏览器F12开发者工具,切换到「网络」面板,触发Grid数据加载,查看
orders_Read接口的请求状态:- 若状态码为500,直接查看响应体中的错误提示,定位后端报错原因
- 若状态码为200,检查返回的JSON结构,看
Data数组是否为空、是否存在Errors字段
- 本地调试后端
orders_Read方法,在return行打断点,确认query.ToList()是否能正常获取到order表数据,ToDataSourceResult执行过程中是否抛出异常 - 检查EF实体的关联配置:确认order与order_summary的外键关联是否正确,是否存在外键非空约束导致EF默认生成内连接查询,过滤掉了没有关联order_summary的order数据
常见解决方案
绝大多数情况是EF导航属性导致的循环引用序列化异常,按以下优先级修复:
方案1:禁用EF延迟加载(最简修复)
序列化时自动加载关联导航属性会触发循环引用,直接在查询前关闭延迟加载即可:
public ActionResult orders_Read([DataSourceRequest] DataSourceRequest request) { using (dbEntities _context = new dbEntities()) { // 关闭延迟加载,避免序列化时自动加载关联的order_summary实体 _context.Configuration.LazyLoadingEnabled = false; IQueryable<order> query = _context.order; return Json(query.ToDataSourceResult(request), JsonRequestBehavior.AllowGet); } }
方案2:配置JSON序列化忽略循环引用
如果需要保留部分关联属性,可在项目全局配置序列化规则,在Global.asax.cs的Application_Start方法中添加:
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
方案3:使用DTO映射返回字段(推荐)
避免直接返回EF实体到前端,按需构造传输对象,只返回Grid需要的字段,从根源避免多余关联属性带来的问题:
// 按需定义DTO类,仅包含Grid展示需要的字段 public class OrderGridDto { public int Id { get; set; } public string OrderNo { get; set; } public DateTime CreateTime { get; set; } // 如果需要展示关联表字段,也可以单独定义 public string SummaryContent { get; set; } } // 接口中做映射转换 public ActionResult orders_Read([DataSourceRequest] DataSourceRequest request) { using (dbEntities _context = new dbEntities()) { var data = _context.order.Select(o => new OrderGridDto { Id = o.Id, OrderNo = o.OrderNo, CreateTime = o.CreateTime, SummaryContent = o.order_summary != null ? o.order_summary.Content : "" }).ToList(); return Json(data.ToDataSourceResult(request), JsonRequestBehavior.AllowGet); } }
关联查询过滤问题修复
如果是EF关联配置错误导致内连接过滤了数据,可手动指定左连接查询,或把外键字段设置为可空类型,避免无关联数据的order被过滤。
内容的提问来源于stack exchange,提问作者Abdulsalam Elsharif
相关产品推荐
相关产品推荐

