我的webapi應用程序設置爲通過使用MessageHandler
基於請求標頭設置數據庫連接來處理多個數據庫連接。然後我在創建上下文時使用這個連接實例。這部分工作很好。但是,我在大多數需要上下文的實體上有一個[NotMapped]
屬性,以便我可以對數據庫運行額外的查詢(顯然,實體來自同一個數據庫)。EF6未映射屬性請求範圍以外的反序列化屬性
問題是,看起來webapi在意識到它有一個未映射的屬性之前完成請求,然後潛入管道以檢索該屬性。然而,在那個時候,我退出了我的消息處理程序,我的連接實例不再被設置,並且當我嘗試在屬性獲取器中創建上下文時,我從連接實例中獲得一個NullRefException
。
這是我看到它在我的腦海:
我首先想到的是,那裏一定是一種方式來獲得從實體上下文。但是,在EF6中,all Entities are simply POCOs which have no knowledge of their context.(請參閱第1條評論)
我唯一能想到的做法是在每個實體中手動設置上下文的實例,以便我可以在NotMapped
屬性中引用它,但這似乎充其量粗略。
我看着這個錯誤的方式嗎?
有關解決方案的任何建議? (?或NotMapped
性質實際上是如何處理的,也許澄清)
編輯:經過進一步的調查,似乎錯誤是由JSON序列化進程中拋出。 (Newtonsoft.Json.JsonSerializationException
)所以看起來,返回的IQueryable在序列化過程中被評估,然後它試圖評估[NotMapped]
屬性,並失敗,因爲連接實例不再存在。
我不得不假設我正在努力完成的事情是可能的,我只是不確定在這一點上。 基本上我需要`[NotMapped]'屬性來了解實體創建的上下文。 建議非常感謝!
讓我看看我是否明白。你正嘗試在你的POCOs中手動實現延遲加載?你是否意識到你錯過了UoW的觀點? –
@JoãoSimões我不是_手動執行惰性加載,我使用Breeze和WebAPI,默認情況下它返回一個IQueryable。我試圖用IQueryables(延遲加載)來支持OData,以便繼續工作。但是,我需要爲每個實體加載一些額外的數據,但在評估IQueryable時,我的上下文會丟失。我當前的解決方案(請參閱答案)是自動保存一些信息,我需要重新創建相同的上下文(在多連接環境中),以便在評估IQueryable時知道在哪裏加載附加數據從。 –