Так что, надеюсь, с некоторыми навыками 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. Кажется, я не могу найти хороший пример в недавно вышедшей книге.
Я просто не могу себе представить, что хорошей практикой является указание моему объектному коду домена вести себя так, как если бы он был в транзакции, когда могут быть моменты, когда это не так.
Может кто-нибудь показать мне, что мне нужно сделать, чтобы исправить это?