Возможно, вы сможете получить некоторую полезную информацию из свойства Target
System.Data.Common.CommandTrees.DbModificationCommandTree
.
В частности, для оператора обновления вы можете увидеть следующую структуру, связанную со свойством Target
, если немного углубиться в детали:
Target (DbExpressionBinding)
- Expression (DbScanExpression)
- Target (System.Data.Metadata.Edm.EntitySetBase)
- Name (string)
Имя относится к имени сущности, установленной в контейнере вашей сущности.
Аналогично, вы можете проверить свойство Predicate
DbUpdateCommandTree
или DbDeleteCommandTree
, чтобы определить ключ затрагиваемой сущности. Для объекта с целочисленным идентификатором столбца для первичного ключа эта структура может выглядеть следующим образом:
Predicate (DbComparisonExpression)
- Left (DbPropertyExpression)
- Property (EdmMember)
- Name: "Id"
- Right (DbConstantExpression)
- Value: 1
Имейте в виду, что значение может быть ссылкой на параметр, а не константой, и что сущности с составными ключами будут иметь более сложные предикаты.
После того как вы извлекли имя набора сущностей и информацию о ключе, вы можете создать EntityKey
и получить состояние, вызвав ObjectStateManager.GetObjectStateEntry(key)
.
Очевидно, что этот подход основан на знании того, как структура сущностей строит свои деревья команд, и не выходит далеко за рамки простых утверждений. Использование DbExpressionVisitor
, чтобы сосредоточиться на особенно важных структурных компонентах дерева, может помочь.