2017-03-18 32 views
2

我想創建一個WebApi使用實體框架從數據庫中讀取數據。使用WebAPI中的實體框架的表上的GET調用異常

我的數據模型設計是這樣的:

enter image description here

我已經加入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); 
     } 
    } 
} 

上調用來自瀏覽器的請求,我的WebAPI控制器GET方法,我得到如下所示的異常。但在調試模式下,我可以看到它能夠從數據庫中獲取數據而沒有任何錯誤,但是一旦控件移出該方法,它就會拋出以下異常。

異常詳細信息:

「消息」:「發生錯誤」。,
「ExceptionMessage」:「在‘ObjectContent`1’型未能序列化內容類型的響應人體的應用/ JSON;字符集= UTF-8' 「,
」ExceptionType「:」 System.InvalidOperationException」
「堆棧跟蹤」:空,
「的InnerException」:{ 「消息」: 「發生錯誤」。 ,
「ExceptionMessage」:「在System.Da上從'tbl_Tournament'獲取值時出錯ta.Entity.DynamicProxies.tbl_Sports_7461105FEAC4FCCBDED534FCE44707AF9C7DFE1E4AD69B1E7E3777FBB953F184' 「,
」ExceptionType。「:」 Newtonsoft.Json.JsonSerializationException 「
」堆棧跟蹤「:」
在Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(目標對象)\ r \ n
在Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CalculatePropertyValues(JsonWriter作家,對象的值,JsonContainerContract合同,JsonProperty構件,JsonProperty屬性,JsonContract & memberContract,對象& memberValue個)\ r \ n
在Newtonsoft.Json.Serialization .JsonSerializerInternalWriter.SerializeObject(JsonWriter作家,對象值,JsonOb 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
在Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeList(JsonWriter作家,IEnumerable的值,JsonArrayContract合同,JsonProperty構件,JsonContainerContract collectionContract,JsonProperty containerProperty個)\ r \ n
在Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter作家,對象值,JsonContract valueContract,JsonProperty成員,JsonContainerContract containerContract,JsonProperty containerProperty)\ r \ n
在Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter,對象的值,類型的objectType個)\ r \ n
在Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter,對象的值,類型的objectType個)\ r \ n
at System.Net.Http.Formatting.BaseJsonMediaTypeFormatter.WriteToStream(Type type,Object value,Stream writeStream,Encoding effectiveEncoding)\ r \ n
at System.Net.Http.Formatting.JsonMediaTypeFormatter。WriteToStream(Type type,Object value,Stream writeStream,Encoding effectiveEncoding)\ r \ n
at System.Net.Http.Formatting.BaseJsonMediaTypeFormatter.WriteToStream(Type type,Object value,Stream writeStream,HttpContent content)\ r \ n
在System.Net.Http.Formatting.BaseJsonMediaTypeFormatter.WriteToStreamAsync(類型類型,對象的值,流writeStream,HttpContent內容,transportContext transportContext,的CancellationToken的CancellationToken個)\ r \ n

從先前位置堆棧跟蹤的結束,其中的例外是拋出

at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\ r \ n
在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任務任務個)\ r \ n
在System.Web.Http.WebHost.HttpControllerHandler.d__1b.MoveNext() 「

」的InnerException「:{」 消息「:」發生了錯誤「,
」ExceptionMessage「:」ObjectContext實例已被處置,不能再用於需要連接的操作。「,
」ExceptionType「:」System.ObjectDisposedException「,
「StackTrace」:「
at System.Data.Entity.Core.Objects.ObjectContext.get_Connection()\ r \ n
在System.Data.Entity.Core.Objects.ObjectQuery 1.GetResults(Nullable 1 forMergeOption個)\ r \ n
在System.Data.Entity.Core.Objects.ObjectQuery 1.Execute(MergeOption mergeOption)\r\n
at System.Data.Entity.Core.Objects.DataClasses.EntityCollection
1.Load(列表1 collection, MergeOption mergeOption)\r\n
at System.Data.Entity.Core.Objects.DataClasses.EntityCollection
1.Load(MergeOption mergeOption) \ r \ n
at System.Data.Entity.Core.Objects.DataClasses.RelatedEnd.DeferredLoad()\ r \ n
at System.Data.Entity.Core.Objects.Internal.LazyLoadBehavior.LoadProperty [TItem]( TItem propertyValue,String relationshipName,String targetRoleName,Boolean mustBeNull,Object wrapperObject)\ r \ n
at 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_Tournament(個)\ r \ n
在Gettbl_Tournament(對象)\ r \ n
在Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(對象 目標)「}}}

我新的實體框架和的WebAPI,一個請求幫助我解決這個問題。

PFB快照,錯誤消息記錄在fidd上LER。目前越來越HTTP 500內部服務器錯誤,

enter image description here

回答

2

那是因爲你啓用了延遲加載,你是你序列化處置DbContext實例後的對象圖。所以發生

  • 您創建的DbContext
  • 您檢索來自的DbContext數據的一種類型
  • 您將數據傳遞到結果的方法
  • 你的DbContext關閉並設置
  • 您的方法存在
  • Asp.Net mvc管道現在嘗試序列化結果的內容
  • 現在嘗試您的類型中的關係在序列化過程
  • 的關係進行嘗試,因爲你必須延遲加載啓用
  • 的的DbContext被佈置成訪問是不可能的,一個異常被拋出

要被從的DbContext檢索要檢索解決它執行以下

  • 移動所述的DbContext到類範圍中的一個,並在處置方法將其處理(覆蓋從ApiController現有方法)
  • 推薦!)關閉loazy加載並使用Include指定要從返回類型中檢索哪些屬性。這將對檢索的內容進行更細粒度的控制,並且性能更高,因爲所有內容都是在單個數據庫調用中而不是在訪問中檢索的。
+1

謝謝隊友。正如所建議的,我使用下面的行從DB讀取數據之前禁用了惰性負載,它確實解決了我的問題。 dbEntity.Configuration.LazyLoadingEnabled = false; – Manju