0

所以希望有一些 CSLA 技能可以帮助我找到更好的方法。我有一种情况,我想从对象外部手动创建事务并将我的 transactionAttribute 设置为手动。

所以我有一些看起来像这样的代码:

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

    objectRef = objectRef.Save();

    //other logic here

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

然后在 save 方法里面有这样的数据访问:

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 最佳实践正确构建。我似乎在我最近得到的书中找不到一个很好的例子。

我只是无法想象告诉我的域对象代码表现得像在事务中的行为是一种好习惯,而有时它可能不是。

谁能告诉我我需要做些什么来正确解决这个问题?

4

1 回答 1

0

好的,所以我需要改变很多事情。但是这种情况的一个明显问题是我在 using 语句中使用了连接。一旦它退出,它就会被处理掉。由于此事务通过了其中的几种方法,因此结果证明我的连接和事务在第一次调用后就被处理掉了。

我现在刚刚经历了一个糟糕的时刻,我意识到了这一点。我讨厌有时答案如此明显。

于 2010-07-02T22:24:36.577 回答