2015-05-28 81 views
0

我的webapi應用程序設置爲通過使用MessageHandler基於請求標頭設置數據庫連接來處理多個數據庫連接。然後我在創建上下文時使用這個連接實例。這部分工作很好。但是,我在大多數需要上下文的實體上有一個[NotMapped]屬性,以便我可以對數據庫運行額外的查詢(顯然,實體來自同一個數據庫)。EF6未映射屬性請求範圍以外的反序列化屬性

問題是,看起來webapi在意識到它有一個未映射的屬性之前完成請求,然後潛入管道以檢索該屬性。然而,在那個時候,我退出了我的消息處理程序,我的連接實例不再被設置,並且當我嘗試在屬性獲取器中創建上下文時,我從連接實例中獲得一個NullRefException

這是我看到它在我的腦海: enter image description here

我首先想到的是,那裏一定是一種方式來獲得從實體上下文。但是,在EF6中,all Entities are simply POCOs which have no knowledge of their context.(請參閱第1條評論)

我唯一能想到的做法是在每個實體中手動設置上下文的實例,以便我可以在NotMapped屬性中引用它,但這似乎充其量粗略。

我看着這個錯誤的方式嗎?
有關解決方案的任何建議? (?或NotMapped性質實際上是如何處理的,也許澄清)


編輯:經過進一步的調查,似乎錯誤是由JSON序列化進程中拋出。 (Newtonsoft.Json.JsonSerializationException)所以看起來,返回的IQueryable在序列化過程中被評估,然後它試圖評估[NotMapped]屬性,並失敗,因爲連接實例不再存在。

我不得不假設我正在努力完成的事情是可能的,我只是不確定在這一點上。 基本上我需要`[NotMapped]'屬性來了解實體創建的上下文。 建議非常感謝!

+0

讓我看看我是否明白。你正嘗試在你的POCOs中手動實現延遲加載?你是否意識到你錯過了UoW的觀點? –

+0

@JoãoSimões我不是_手動執行惰性加載,我使用Breeze和WebAPI,默認情況下它返回一個IQueryable。我試圖用IQueryables(延遲加載)來支持OData,以便繼續工作。但是,我需要爲每個實體加載一些額外的數據,但在評估IQueryable時,我的上下文會丟失。我當前的解決方案(請參閱答案)是自動保存一些信息,我需要重新創建相同的上下文(在多連接環境中),以便在評估IQueryable時知道在哪裏加載附加數據從。 –

回答

0

我不主張這是最好的解決辦法,但由於目前還沒有人提出其他任何東西,我張貼了我想出迄今:

我最終什麼事做的是加入connectionString變量爲我的BaseEntity類,所有我的實體派生自。在BaseEntity構造函數中,當創建實體時,我將此屬性設置爲當前正在使用的連接字符串(此時位於範圍內)。

然後,無論何時我的[NotMapped]屬性在稍後訪問(用於反序列化或其他方式),我都會引用實體上的連接屬性以創建我的上下文。

事情是這樣的:

public class BaseEntity 
{ 
    public BaseEntity() 
    { 
     // Save current connection string being used to create the entity. 
     // ConnectionManager.Instance.CurrentConnection will be null by the time deserialization happens 
     _connectionString = ConnectionManager.Instance.CurrentConnection.ConnectionString; 
    } 

    private readonly string _connectionString; 

    [NotMapped] 
    public string MyProperty 
    { 
     using (var ctx = new MyContext(_connectionString)) 
      ... 
    } 
} 

這似乎是偉大的工作,到目前爲止,我認爲將是我的解決方案。請隨時提出任何替代/改進的解決方案。