Как я могу заставить Entity Framework и WCF работать с транзакциями?Хорошо ... в чем секрет? - PullRequest
5 голосов
/ 22 ноября 2011

Я пробовал несколько разных способов, чтобы заставить простой набор транзакций работать для простой ситуации клиент / сервер WCF. Мой WCF-сервер имеет объявление уровня класса класса Entity Framework для доступа к моей базе данных и несколько методов для изменения данных и метод SaveChanges. Я использую Oracle Data Access (ODP.NET).

Например, я хочу вызвать модификацию с клиента, а затем отдельный вызов, чтобы сохранить изменения в службе WCF. Не работает По сути, все выполняется нормально, но когда сделан второй вызов для сохранения изменений, служба WCF больше не имеет исходного контекста и, следовательно, изменения не сохраняются (и, следовательно, предыдущий вызов, который внес изменения, автоматически откатывается) .

Я использую область транзакции вокруг обеих операций в моем клиенте и выполняю Complete () после выполнения. Мои сервисы WCF имеют OperationContract, которые используют [TransactionFlow(TransactionFlowOption.Mandatory)], а эти реализации методов используют [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]. Наконец, моя веб-конфигурация настроена с помощью wsHttpBinding, для свойства transactionFlow которого установлено значение True.

Мне не повезло. Независимо от того, что я пытаюсь, когда я пытаюсь запустить службу для последующего сохранения, контекст EF уже обновляется.

Ответы [ 2 ]

4 голосов
/ 22 ноября 2011

Это не имеет ничего общего с транзакцией.Транзакция работает на транзакционном ресурсе, но без вызова SaveChanges в первом запросе не было активного транзакционного ресурса, поскольку контекст EF не является частью транзакции - база данных и база данных затрагивается только при вызове SaveChanges.Для этого вам не нужны распределенные транзакции.Вам необходимо полное обслуживание сеанса и сохранить контекст EF в экземпляре службы.Если клиент использует один и тот же экземпляр прокси-сервера клиента для связи со службой для всех запросов, связь будет обрабатываться тем же экземпляром службы = тем же экземпляром контекста EF, который запомнит изменения от предыдущих вызовов.

ИМХО, это оченьплохая архитектура.Просто не используйте это.Предоставьте специализированные методы для службы WCF, которые будут вносить изменения и сохранять их.Если вам нужно выполнить эти методы в транзакции с другими транзакционными ресурсами, используйте реальную распределенную транзакцию.

1 голос
/ 22 ноября 2011

это может быть причиной.Так как вы делаете обновление в другом контексте.context не знает, что объект обновляется, чтобы сообщить контекст, что объект был изменен, и затем вы вызываете savechnages ().Посмотрите, поможет ли это

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