2012-08-10 93 views
0

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

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,在这里扮演一个角色?任何帮助,将不胜感激。

回答

0

很遗憾地说,这是由于代码碎片不好的情况。我的低级dll插入的源代码不是用于生成我的项目引用的二进制文件。其中的区别在于事务处理范围被定义为RequiresNew。对不起,浪费了任何人的时间.....它仍然可以作为一个例子,说明糟糕的版本控制会浪费一天的工作量!