использование транзакций в csla и ручной транзакцииcopecope - PullRequest
0 голосов
/ 02 июля 2010

Так что, надеюсь, с некоторыми навыками CSLA, которые помогут мне увидеть лучший способ с этим. У меня возникла ситуация, когда я хочу вручную создать свою транзакцию вне объекта и установить для моего атрибутаactionAttribute значение manual.

Итак, у меня есть код, который выглядит следующим образом:

using (SqlConnection conn ConnectionManager<SqlConnection>.GetManager("Db").Connection)
{
    connectionTransaction = conn.BeginTransaction();

    objectRef = objectRef.Save();

    //other logic here

    objectRef = objectRef.Save();
    connectionTransaction.Commit();
}

Тогда внутри метода сохранения есть что-то вроде этого для доступа к данным:

using (var conn = ConnectionManager<SqlConnection>.GetManager("Db").Connection)
{
    using (var cm = conn.CreateCommand())
    {
        cm.CommandType = CommandType.StoredProcedure;
        cm.CommandText = "Proc_Name";

        // param definitions

        cm.ExecuteNonQuery();
    }
}

Когда я делаю это, я получаю следующую ошибку:

ExecuteNonQuery требует, чтобы команда имела транзакцию, когда назначенное команде соединение находится в ожидающей локальной транзакции. Свойство Transaction команды не было инициализировано.

Хорошо, это имеет смысл, о чем идет речь, и я мог бы легко это исправить, назначив транзакцию команде. Но мне интересно, действительно ли это правильно структурировано в соответствии с лучшими практиками CSLA. Кажется, я не могу найти хороший пример в недавно вышедшей книге.

Я просто не могу себе представить, что хорошей практикой является указание моему объектному коду домена вести себя так, как если бы он был в транзакции, когда могут быть моменты, когда это не так.

Может кто-нибудь показать мне, что мне нужно сделать, чтобы исправить это?

1 Ответ

0 голосов
/ 03 июля 2010

Хорошо, поэтому мне нужно было многое изменить. Но одной из явных проблем в этой ситуации является то, что у меня есть соединение, которое используется в операторе использования. Который, как только он выходит, он утилизируется. Так как эта транзакция проходит через несколько таких методов, оказалось, что мое соединение и транзакция были удалены после первого вызова.

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

...