代码之家  ›  专栏  ›  技术社区  ›  spinon

在CSLA和手动TransactionScope中使用事务

  •  0
  • spinon  · 技术社区  · 14 年前

    所以希望有了一些CSLA技能,我能看到更好的方法。在这种情况下,我希望从对象外部手动创建事务,并将TransactionAttribute设置为Manual。

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

    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();
        }
    }
    

    执行此操作时,我收到以下错误:

    当分配给命令的连接处于挂起的本地事务中时,ExecuteOnQuery要求命令具有事务。命令的事务属性尚未初始化。

    好的,所以这是有意义的,我可以通过将事务分配给命令很容易地修复它。但我想知道,根据CSLA的最佳实践,这是否是正确的结构。在我最近得到的书中,我似乎找不到一个很好的例子。

    我只是无法想象告诉我的域对象代码像事务中的代码一样工作是一个很好的实践,有时它可能不工作。

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

    1 回复  |  直到 14 年前
        1
  •  0
  •   spinon    14 年前

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

    我刚才有一个该死的时刻,我意识到了。我讨厌有时候答案会如此明显。