我自我引用循环错误,但我的问题与它无关。它更多的是在推理上
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;
更新
根据理查德要求。我在这里简短而简单..
var WareTypeData = sls.WareTypes;
var tempVariable =WareTypeData .ToList();
答案 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应用程序中,控制器的生命周期) )。