在WebAPI中使用Entity Framework对表进行GET调用的异常

Man*_*nju 3 c# entity-framework asp.net-web-api

我正在尝试使用Entity Framework创建一个WebApi来从数据库中读取数据.

我的数据模型设计如下所示:

在此输入图像描述

我添加了一个名为SportsController这样的WebApi控制器:

public class SportsController : ApiController
{
    public HttpResponseMessage Get()
    {
        try
        {
            using (MyLeagueDBEntities dbEntity = new MyLeagueDBEntities())
            {
                return Request.CreateResponse(HttpStatusCode.OK, dbEntity.tbl_Sports.ToList());
            }
        }
        catch (Exception ex)
        {
            return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在从浏览器调用我的WebApi控制器GET方法的请求时,我得到如下所示的异常.但是在调试模式下,我可以看到它能够从数据库中获取数据而没有任何错误,但是一旦控件移出方法,它就会抛出以下异常.

例外细节:

"消息":"发生了错误.",
"ExceptionMessage":"'ObjectContent`1'类型无法序列化内容类型'application/json; charset = utf-8'.",
"ExceptionType" 的响应正文:"System.InvalidOperationException",
"StackTrace":null,
"InnerException":{"消息":"发生错误.",
"ExceptionMessage":"从'System.Data.Entity'的'tbl_Tournament'获取值时出错. DynamicProxies.tbl_Sports_7461105FEAC4FCCBDED534FCE44707AF9C7DFE1E4AD69B1E7E3777FBB953F184' ",.
"ExceptionType":" Newtonsoft.Json.JsonSerializationException "
"堆栈跟踪":"
在Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(目标对象)\ r \n
在Newtonsoft.Json.Serialization.JsonSerializerInternalWriter .CalculatePropertyValues(JsonWriter writer,JasonContainerContract契约,JsonProperty成员,JsonProperty属性,JsonContract&memberContract,Object&memberValue)\ r \n
在Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer,Object value,JsonObjectContract契约,JsonProperty成员,JsonContainerContract collectionContract,JsonProperty containerProperty)\ r \n>在Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer,Object value,JsonContract valueContract,JsonProperty成员,JsonContainerContract containerContract,JsonProperty containerProperty)\ r \n
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeList(JsonWriter writer,IEnumerable values,JsonArrayContract contract,JsonProperty member,JsonContainerContract collectionContract,JsonProperty containerProperty)\ r \n
在Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer,Object value, JsonContract valueContract,JsonProperty成员,JsonContainerContract containerContract,JsonProperty containerProperty)\ r \n
在Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter,Object value,Type objectType)\ r \n
在Newtonsoft.Json.JsonSer ializer.SerializeInternal(JsonWriter jsonWriter,对象的值,类型的objectType个)\ r \n
在System.Net.Http.Formatting.BaseJsonMediaTypeFormatter.WriteToStream(类型类型,对象的值,流writeStream,编码effectiveEncoding个)\ r \n
在System.Net .Http.Formatting.JsonMediaTypeFormatter.WriteToStream(Type type,Object value,Stream writeStream,Encoding effectiveEncoding)\ r \n
在System.Net.Http.Formatting.BaseJsonMediaTypeFormatter.WriteToStream(Type type,Object value,Stream writeStream,HttpContent content)\r \n
在System.Net.Http.Formatting.BaseJsonMediaTypeFormatter.WriteToStreamAsync(Type type,Object value,Stream writeStream,HttpContent content,TransportContext transportContext,CancellationToken cancellationToken)\ r \n

从抛出异常的先前位置开始的堆栈跟踪结束

at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务
)\ r \n
在System.Web.Http.WebHost.HttpControllerHandler.d__1b.MoveNext的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)\ r \n ()",

"InnerException":{"Message":"发生错误.",
"ExceptionMessage":"ObjectContext实例已被释放,不能再用于需要连接的操作.",
"ExceptionType":"System. ObjectDisposedException",
"StackTrace":"
在System.Data.Entity.Core.Objects.ObjectContext.get_Connection()\ r \n,
在System.Data.Entity.Core.Objects.ObjectQuery 1.GetResults(Nullable1 forMergeOption)\ r \n
在System. Data.Entity.Core.Objects.ObjectQuery 1.Load(List 1.Load(MergeOption mergeOption)\ r \n 在System.Data.Entity.Core.Objects.DataClasses.RelatedEnd.DeferredLoad()\ r \n 在System. Data.Entity.Core.Objects.Internal.LazyLoadBehavior.LoadProperty [TItem](TItem propertyValue,String relationshipName,String targetRoleName,Boolean mustBeNull,Object wrapperObject)\ r \n 在System.Data.Entity.Core.Objects.Internal.LazyLoadBehavior .<> c__DisplayClass7`2.b__1(TProxy代理,TItem项目)\ r \n 在System.Data.Entity.DynamicProxies.tbl_Sports_7461105FEAC4FCCBDED534FCE44707AF9C7DFE1E4AD69B1E7E3777FBB953F184.get_tbl_T 我的装饰()\ r \n 在Gettbl_Tournament(对象)\ r \n 在Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(对象目标)"}}}1.Execute(MergeOption mergeOption)\r\n
at System.Data.Entity.Core.Objects.DataClasses.EntityCollection
1 collection, MergeOption mergeOption)\r\n
at System.Data.Entity.Core.Objects.DataClasses.EntityCollection






我是Entity Framework和WebApi的新手,要求我帮助解决这个问题.

PFB快照,并在fiddler上记录错误消息.目前得到Http 500内部服务器错误,

在此输入图像描述

Igo*_*gor 8

这是因为您启用了延迟加载,并且在处理DbContext实例后序列化对象图.发生了什么事

  • 您创建一个DbContext
  • 您从DbContext中检索该类型的数据
  • 您将数据传递给Result方法
  • 您的DbContext已关闭并处理完毕
  • 你的方法存在
  • Asp.Net mvc管道现在尝试序列化结果的内容
  • 现在尝试在序列化过程中检索您的类型中的关系
  • 尝试从DbContext检索关系,因为您启用了延迟加载
  • DbContext被释放,因此无法访问,抛出异常

要解决此问题,请执行以下操作之一

  • 将DbContext移动到类范围并在Disposing方法中处理它(从ApiController覆盖现有方法)
  • (推荐!)关闭loazy加载并使用返回的类型指定要检索的属性Include.这将对检索的内容进行更细粒度的控制,并且性能更高,因为所有内容都是在单个数据库调用中检索而不是在访问时检索.

  • 谢了哥们。如建议的那样,在使用下面一行从数据库读取数据之前,我禁用了延迟加载,这确实解决了该问题。dbEntity.Configuration.LazyLoadingEnabled = false; (3认同)