2011-12-19 172 views
1

我試圖做一些工作與EFProviderWrapperToolkit http://blogs.msdn.com/b/jkowalski/archive/2009/06/11/tracing-and-caching-in-entity-framework-available-on-msdn-code-gallery.aspx實體框架:獲取實體相關聯與DbCommandTree

在我的派生DbCommandWrapper,有沒有什麼辦法讓在ObjectStateManager相關的實體,如果有問題的DbCommandTreeDbModificationCommandTree

基本上,我想要做的事,如:

if (base.Definition.CommandTree is DbModificationCommandTree) 
{ 
    var targetEntity = ((DbModificationCommandTree)base.Definition.CommandTree).TargetEntity; 
} 

回答

0

不,我不認爲這是可能的 - 它是分層的體系結構和低層不必知道上層的任何東西。

+0

我想這可能是這種情況....是否至少有一種方法可以獲得與ObjectStateEntries相關的語句生成順序? – Jeff

1

功能CreateDbCommandDefinitionDbProviderServices有兩個參數:DbProviderManifest manifest, DbCommandTree commandTree

commandTree可以是DbInsertCommandTree,DbUpdateCommandTreeDbDeleteCommasndTree

所以你可以檢測到它是否是修改命令。

0

看來你也許能從TargetSystem.Data.Common.CommandTrees.DbModificationCommandTree的財產中獲得一些有用的信息。

特別是,對於一個更新語句,你可能會看到與Target屬性相關聯的結構如下,如果你深入一點:

Target (DbExpressionBinding) 
- Expression (DbScanExpression) 
    - Target (System.Data.Metadata.Edm.EntitySetBase) 
     - Name (string) 

的名稱指的是實體在實體容器設置的名稱。

同樣,您可以檢查Predicate屬性DbUpdateCommandTreeDbDeleteCommandTree以確定受影響實體的密鑰。對於整數列ID爲一個主鍵的實體,這種結構可能看起來像:

Predicate (DbComparisonExpression) 
- Left (DbPropertyExpression) 
    - Property (EdmMember) 
     - Name: "Id" 
- Right (DbConstantExpression) 
    - Value: 1 

記住該值可能是一個參數引用,而不是一個常數,即複合主鍵實體將有更多的複雜的謂詞。

一旦您提取了實體集名稱和密鑰信息,就可以構建一個EntityKey並通過調用ObjectStateManager.GetObjectStateEntry(key)來獲取狀態。

很顯然,這種方法依賴於實體框架如何構造它的命令樹並且不會超出簡單語句的知識。使用DbExpressionVisitor專注於樹的特別重要的結構組件可能會有所幫助。