2011-12-19 44 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专注于树的特别重要的结构组件可能会有所帮助。