如何使用实体框架构建基于 3 个表的 JSON

Posted

技术标签:

【中文标题】如何使用实体框架构建基于 3 个表的 JSON【英文标题】:How to build a JSON based on 3 tables using Entity Framework 【发布时间】:2019-08-18 09:41:48 【问题描述】:

我试图在 MVC 中使用 JsonResult 方法显示 JSON,我使用的是实体框架,但我的问题是 PostMan 显示服务器错误:

ObjectContext 实例已被释放,不能再用于需要连接的操作。

我正在使用一个涉及 3 个不同表的查询,但是其中一个表可能会检索超过 3 个不同的行。

这是我的代码:

[HttpGet]
    [AllowAnonymous]
    public JsonResult RetreiveResume(int User)
    
        using (var context = new DexusEntities())
        
            var collection = (from p in context.CND_PersonalData join
                              pd in context.CND_ProfessionalData on p.UserId equals pd.UserId join
                              ex in context.CND_ExperiencesData on p.UserId equals ex.UserId select p).ToList();
            return Json(collection, JsonRequestBehavior.AllowGet);
        
    

我的代码有什么问题?

提前致谢。

【问题讨论】:

你用的是asp mvc核心吗? 查看此链接:***.com/questions/18398356/… 您应该包含表达式返回的主要实体的子集合。像 CND_ExperiencesData.Include("collectionName"),如果您共享您的模型定义,会更容易为您提供帮助。 我不确定。我想我是。 【参考方案1】:

使用后移动返回线。您正在尝试返回结果后处理上下文。您可以查看此链接了解更多信息:What happens if i return before the end of using statement? Will the dispose be called?

[HttpGet]
[AllowAnonymous]
public JsonResult RetreiveResume(int User)

    var collection = new CND_PersonalData();

    using (var context = new DexusEntities())
    
        context.Configuration.LazyLoadingEnabled = false; 
        collection = (from p in context.CND_PersonalData join
                          pd in context.CND_ProfessionalData on p.UserId equals pd.UserId join
                          ex in context.CND_ExperiencesData on p.UserId equals ex.UserId select p).ToList();
    

    return Json(collection, JsonRequestBehavior.AllowGet);

【讨论】:

它说:无法将类型 System.Collections.Generic.Lis 转换为 MySolution.CND_PersonalData 我改成了 List collection = new List();但它不起作用。 您仍然有相同的错误或不同的错误?你的邮递员 http 方法是正确的吗? 您也可以尝试禁用延迟加载吗? context.Configuration.LazyLoadingEnabled = false; 卡迪尔,您的最后一条评论效果很好! context.Configuration.LazyLoadingEnabled = false;解决了这个问题。我还必须对代码进行一些修改。【参考方案2】:

请您尝试将 return 放在括号之后,如下所示:

using (var context = new DexusEntities())
        
            var collection = (from p in context.CND_PersonalData join
                              pd in context.CND_ProfessionalData on p.UserId equals pd.UserId join
                              ex in context.CND_ExperiencesData on p.UserId equals ex.UserId select p).ToList();
            return Json(collection, JsonRequestBehavior.AllowGet);
        

【讨论】:

以上是关于如何使用实体框架构建基于 3 个表的 JSON的主要内容,如果未能解决你的问题,请参考以下文章

如何在实体框架中调用带有联接的存储过程?

如何加快对 3 个表的 MySQL 查询(总共大约 60M 行)

如何从实体框架中存在数据模型的json中反序列化对象?

如何使用实体框架的导航属性来构建视图模型

如何将一个自定义实体映射到实体框架中的某些数据库表?

如何使用 3 个表在 SQL 查询中获得完整结果,其中 1 个表保持 2 个表的关系?