实体框架:获取与DbCommandTree关联的实体

时间:2011-12-19 23:31:36

标签: .net entity-framework entity-framework-4

我正在尝试使用EFProviderWrapperToolkit做一些工作 http://blogs.msdn.com/b/jkowalski/archive/2009/06/11/tracing-and-caching-in-entity-framework-available-on-msdn-code-gallery.aspx

在我的派生DbCommandWrapper中,如果相关的ObjectStateManagerDbCommandTree,有没有办法在DbModificationCommandTree中获取相关实体?

基本上,我想做类似的事情:

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

3 个答案:

答案 0 :(得分:1)

CreateDbCommandDefinition的{​​{1}}函数有两个参数:DbProviderServices

DbProviderManifest manifest, DbCommandTree commandTree可以是commandTreeDbInsertCommandTreeDbUpdateCommandTree

所以你可以检测它是否是修改命令。

答案 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关注树的特别重要的结构组件可能会有所帮助。