实体框架序列化查询

时间:2015-10-07 15:34:40

标签: entity-framework-5

我自我引用循环错误,但我的问题与它无关。它更多的是在推理上

             try
                {
                    using (MyEntities sls = new MyEntities ())
                    {


                        return Request.CreateResponse(HttpStatusCode.OK, WareTypeData );
                    } var WareTypeData = sls.WareTypes;
                }
                catch (Exception ex)
                {
                    return Request.CreateResponse<string>(HttpStatusCode.InternalServerError, ex.Message);
                }

在此版本的代码中,我收到错误消息为&#34;从“未授权的应用列表”中获取值的错误&#39; &#34; 和innerexception是 ObjectContext实例已被释放,不能再用于需要连接的操作

异常的实际原因是自我引用循环,如果我不使用&#34; using语句&#34;并定义实体变量jus,如

  try
    {
      MyEntities sls = new MyEntities ();

问题1: 如果我使用&#34; using语句&#34;,我会收到错误消息,因为对象上下文在某个时间点处理。为什么会这样?我在&#34;中使用范围&#34;返回变量。这里。

问题2: 当我进行调试时,断点没有在catch块中命中..为什么?是因为它是序列化问题吗?它会不会在Catch块中处理? &#34;对象被处置不是正常的EF异常?&#34;

更新

根据理查德要求。我在这里简短而简单..

  • 我使用该行创建IEnumerable。我知道它没有击中DB。 它只是制定了查询var WareTypeData = sls.WareTypes;
  • 我创建了一个临时变量并使用该行将其转换为list。它击中了 数据库var tempVariable =WareTypeData .ToList();
  • 正如我所指出的,WareTypes与另外一个表有很多关系 与其他表有类似的关系,它重复3或4次。它 导致&#34;自我引用循环问题,而系列化和我期望 错误输出与&#34; 自我引用循环&#34;相关的内容但 这里发生的是,我得到 对象处置错误消息 。一世 确保所有代码块都在&#34;仅使用语句&#34;内。通缉 知道为什么会发生这种情况吗?
P.S:我正在寻找事情背后的推理。从解决方案来看,我刚刚开始使用DTO类和代理禁用。

1 个答案:

答案 0 :(得分:0)

这两个问题都归结为懒惰。这是一件好事。

执行时:

var WareTypeData = sls.WareTypes;

你还没有(还)得到所有WareType行,但是一个懒惰的查询只会在枚举时获取这些行。这允许您进行连锁操作:

WareTypeData = WareTypeData.Where(wt => wt.Kind = "Wolf");

当您最终枚举查询时,它将被转换为SQL并发送到数据库以供执行。这意味着您可以对数据库执行所有过滤,连接,排序和转换(这是为了擅长这些事情)。

但是,这也意味着您需要确保在上下文仍然存在时进行枚举。在你的情况下,它只发生在你的函数返回后,它会破坏上下文。因此查询失败。

要修复,请确保枚举查询以实际执行SQL并获取using块中的数据:

var WareTypeData = sls.WareTypes.ToArray();

根据应用程序的类型,将上下文的生命周期与更多与整体逻辑操作相关联的对象实例联系起来可能更有意义(例如,在ASP.NET MVC Web应用程序中,控制器的生命周期) )。