【问题标题】:Entity Framework: Get Entity Associated with DbCommandTree实体框架:获取与 DbCommandTree 关联的实体
【发布时间】:2011-12-19 23:31:35
【问题描述】:

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

在我派生的DbCommandWrapper 中,如果有问题的DbCommandTreeDbModificationCommandTree,是否有任何方法可以获取ObjectStateManager 中的关联实体?

基本上,我想做这样的事情:

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

【问题讨论】:

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


    【解决方案1】:

    DbProviderServices 的函数CreateDbCommandDefinition 有两个参数:DbProviderManifest manifest, DbCommandTree commandTree

    commandTree 可以是DbInsertCommandTreeDbUpdateCommandTreeDbDeleteCommasndTree

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

    【讨论】:

      【解决方案2】:

      没有。我认为这是不可能的——它是分层架构,低层不必了解上层的任何信息。

      【讨论】:

      • 我认为可能是这种情况......至少有一种方法可以让我获得与 ObjectStateEntries 相关的语句的生成顺序吗?
      【解决方案3】:

      您似乎可以从System.Data.Common.CommandTrees.DbModificationCommandTreeTarget 属性中获得一些有用的信息。

      特别是,对于更新语句,您可能会看到以下与 Target 属性相关的结构,如果您深入研究一下:

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

      Name 是指实体容器中设置的实体的名称。

      同样,您可以检查DbUpdateCommandTreeDbDeleteCommandTreePredicate 属性以确定受影响实体的键。对于主键具有整数列 ID 的实体,此结构可能如下所示:

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

      请记住,该值可能是参数引用而不是常量,并且具有复合键的实体将具有更复杂的谓词。

      一旦你提取了实体集名称和关键信息,你就可以构造一个EntityKey并通过调用ObjectStateManager.GetObjectStateEntry(key)来获取状态。

      显然,这种方法依赖于实体框架如何构建其命令树的知识,并且不能很好地扩展到简单的语句之外。使用DbExpressionVisitor 关注树的特别重要的结构组件可能会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多