Entity Framework: получить сущность, связанную с DbCommandTree - PullRequest
1 голос
/ 20 декабря 2011

Я пытаюсь сделать некоторую работу с 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; 
}

Ответы [ 3 ]

1 голос
/ 27 января 2012

Функция CreateDbCommandDefinition из DbProviderServices имеет два параметра: DbProviderManifest manifest, DbCommandTree commandTree.

commandTree может быть DbInsertCommandTree, DbUpdateCommandTree или DbDeleteCommasndTree.

Таким образом, вы можете определить, является ли это командой изменения или нет.

0 голосов
/ 26 июня 2012

Возможно, вы сможете получить некоторую полезную информацию из свойства 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, чтобы сосредоточиться на особенно важных структурных компонентах дерева, может помочь.

0 голосов
/ 20 декабря 2011

Нет.Я не думаю, что это возможно - это многоуровневая архитектура и низкоуровневый слой, который не должен ничего знать о верхнем уровне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...