我正在尝试使用EFProviderWrapperToolkit
做一些工作
http://blogs.msdn.com/b/jkowalski/archive/2009/06/11/tracing-and-caching-in-entity-framework-available-on-msdn-code-gallery.aspx
在我的派生DbCommandWrapper
中,如果相关的ObjectStateManager
是DbCommandTree
,有没有办法在DbModificationCommandTree
中获取相关实体?
基本上,我想做类似的事情:
if (base.Definition.CommandTree is DbModificationCommandTree)
{
var targetEntity = ((DbModificationCommandTree)base.Definition.CommandTree).TargetEntity;
}
答案 0 :(得分:1)
CreateDbCommandDefinition
的{{1}}函数有两个参数:DbProviderServices
。
DbProviderManifest manifest, DbCommandTree commandTree
可以是commandTree
,DbInsertCommandTree
或DbUpdateCommandTree
。
所以你可以检测它是否是修改命令。
答案 1 :(得分:0)
没有。我不认为这是可能的 - 它是分层架构,低级层不需要了解任何有关上层的知识。
答案 2 :(得分:0)
您似乎可以从Target
的{{1}}属性中获取一些有用的信息。
特别是,对于更新语句,如果向下钻取一点,您可能会看到与System.Data.Common.CommandTrees.DbModificationCommandTree
属性关联的以下结构:
Target
“名称”是指实体容器中设置的实体的名称。
同样,您可以检查Target (DbExpressionBinding)
- Expression (DbScanExpression)
- Target (System.Data.Metadata.Edm.EntitySetBase)
- Name (string)
或Predicate
的{{1}}属性,以确定受影响实体的密钥。对于具有主键的整数列Id的实体,此结构可能如下所示:
DbUpdateCommandTree
请记住,值可能是参数引用而不是常量,具有复合键的实体将具有更复杂的谓词。
提取实体集名称和密钥信息后,您可以构建DbDeleteCommandTree
并通过调用Predicate (DbComparisonExpression)
- Left (DbPropertyExpression)
- Property (EdmMember)
- Name: "Id"
- Right (DbConstantExpression)
- Value: 1
获取状态。
显然,这种方法依赖于实体框架如何构造其命令树的知识,并且不会超出简单的语句。使用EntityKey
关注树的特别重要的结构组件可能会有所帮助。