代码优先事务包装

时间:2012-08-10 08:29:01

标签: c# entity-framework transactions

我们有一个现有的数据库,其中包含用户表和代码库(用VB.Net编写),它实现了某些业务逻辑,并处理将“遗留用户”记录添加到数据库中。我正在进行的项目现在需要创建一个“扩展”用户的新实体(ExternalUser)。我们选择通过创建旧用户记录来实现新实体,并将其与新表以一对一的关系链接。当要求创建新的ExternalUser时,UserRepository将调用遗留代码来创建记录的User部分,然后存储库将使用EF Code First 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来执行此处的角色?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我很遗憾地说,这是由于代码碎片的坏情况造成的。我对插入的低级别dll的源代码不是用于生成二进制我的项目引用的源代码。其中的不同之处在于transactioncope被定义为RequiresNew。很抱歉浪费了任何时间.....它仍然可以作为一个例子,如何糟糕的版本控制可以浪费一天的工作!!