在csla和manual transactionscope中使用事务

时间:2010-07-01 23:40:50

标签: c# transactions csla

所以希望有一些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的最佳实践,这是否真的是正确的。我似乎无法在我最近得到的书中找到一个很好的例子。

我无法想象,告诉我的域对象代码在某个事务中的行为就像是在事务中,这是好的做法。

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

1 个答案:

答案 0 :(得分:0)

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

我刚才有一个这样的时刻,我意识到了这一点。我讨厌有时答案如此明显。