2010-01-21 43 views
0

我需要找出具有特定主鍵的對象是否已經連接到DataContext並從DataContext獲取實體(如果已連接)。有沒有什麼辦法可以做到這一點,而不需要完全信任的反思?如何訪問或替換LINQ to SQL的IdentityManager?

理想情況下,我想調用GetCachedObject(),但我不得不使用反射來得到這個結果,而且我很確定我必須處於完全信任模式,這將不起作用在託管環境中。

我開到這裏逆向思考。另外,我可以完全控制生成的LinqToSql代碼,所以這也不是問題。我可以重寫我的DataContext類。有什麼方法可以訪問IdentityManager,用我自己的抽象替換IdentityManager等等?任何和所有想法都是受歡迎的。

+0

不,反思是唯一的方法。 – KristoferA 2010-01-22 07:00:46

回答

0

一個潛在的 '處理方法'。我沒有嘗試過,所以不知道它是否會工作... ...但是因爲你說'開箱即用':將錯誤的連接或錯誤的連接字符串分配給DC,或搞砸了sqlconnection它已經有了。接下來通過PK查詢對象。如果它在緩存中,那麼L2S很可能不會注意到連接不好,所以應該返回對象。如果它不在緩存中,L2S應該嘗試一次db往返,你會得到一個異常。

正如我所說的,骯髒的和未經考驗的,但值得一試,如果你真的想避免使用反射來獲取訪問身份管理器/更改跟蹤。不知道這是否會保存任何CPU週期,但... :)

+1

感謝您的建議。我已經決定要完成我想要做的事情太討厭了。雖然反射起作用,但它不能在託管環境中工作。我要朝一個完全不同的方向前進。我真的希望MS將LinqToSql作爲開源發佈,並讓社區放棄作爲DataContext的deathgrip。 – 2010-02-19 21:40:00

0

如果你控制生成的代碼,爲什麼不能讓每一個實體的構造函數在每個線程的字典註冊。這樣你就擁有當前線程的所有現有實體。如果每個線程有一個數據上下文,那麼現在你有一個所有加載(但不一定是附加)實體的列表。