我们有一个现有的数据库,其中包含用户表和代码库(用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来执行此处的角色?任何帮助将不胜感激。
答案 0 :(得分:0)
我很遗憾地说,这是由于代码碎片的坏情况造成的。我对插入的低级别dll的源代码不是用于生成二进制我的项目引用的源代码。其中的不同之处在于transactioncope被定义为RequiresNew。很抱歉浪费了任何时间.....它仍然可以作为一个例子,如何糟糕的版本控制可以浪费一天的工作!!