0

我们有一个现有的数据库,其中包含一个用户表和一个代码库(用 VB.Net 编写),它实现了某些业务逻辑并处理将“旧用户”记录添加到数据库中。我现在正在进行的一个项目需要创建一个“扩展”用户的新实体(ExternalUser)。我们选择通过创建旧用户记录并将其与新表以一对一的关系链接来实现新实体。当被要求创建新的 ExternalUser 时,UserRepository 将调用旧代码以创建记录的用户部分,然后存储库将首先使用 EF 代码 ExternalUserContext 在 ExternalUsers 表中创建记录。当然,如果第二次调用因任何原因失败,我们希望撤销旧用户的创建。这就是事情失败的地方。我们使用的是 SQL Server 2005 和 EF Code 4.3.1。以下是相关代码:

using (_context = new ExternalUserContext(Utils.ConnectionString))
{
     ObjectContext ob = ((IObjectContextAdapter) _context).ObjectContext;
     ob.Connection.Open();
     DbTransaction tran = ob.Connection.BeginTransaction(System.Data.IsolationLevel.ReadUncommitted);
     _legacyUser = new blUser();
     long id = _legacyUser.Add(//Params go here);
     if (id > 0)
     {
         toCreate.UserID = id;
         _context.ExternalUsers.Add(toCreate);
         tran.Rollback(); //Just for testing
         throw new FieldAccessException("testing"); //just for testing
         _context.SaveChanges();
         tran.Commit();
      }else
      {
          throw new ArgumentException("Could not create legacy user");
      }
 }

在尝试显式管理事务之前,我曾尝试使用 TransactionScope(在实例化 ExternalUserContext 之前或之后开始),但均无济于事。引用的代码会引发错误,但用户记录仍保留在数据库中。VB 代码正在调用另一个执行实际记录创建的 .dll。两个 dll 都使用默认设置将创建包装在 TransactionScope 中。

我的代码正在调用一个 dll,而该 dll 本身正在调用一个执行数据库事务的 dll,这一事实是否在这里起作用?任何帮助,将不胜感激。

4

1 回答 1

0

我很遗憾地说,事实证明这是由于代码碎片的严重情况造成的。我拥有的用于插入的低级 dll 的源代码不是用于生成我的项目引用的二进制文件的源代码。不同之处在于事务范围被定义为 RequiresNew。很抱歉浪费了任何人的时间.....它仍然可以作为糟糕的版本控制如何浪费一天工作的一个例子!

于 2012-08-10T11:48:17.567 回答