我们有一个现有的数据库,其中包含一个用户表和一个代码库(用VB.Net编写),该代码库实现了特定的业务逻辑,并处理向数据库添加“遗留用户”记录。我现在正在做的一个项目需要创建一个新的实体(ExternalUser)来“扩展”用户。我们选择通过创建遗留用户记录并以一对一的关系将其与新表相链接来实现新实体。当要求创建新的ExternalUser时,UserRepository将调用遗留代码来创建记录的用户部分,然后存储库将使用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。这两个dlls都将创建封装在具有默认设置的TransactionScope中。
我的代码调用的dll本身也调用了执行数据库事务的dll,这一点在这里起作用了吗?任何帮助都将不胜感激。
发布于 2012-08-10 19:48:18
我很遗憾地说,事实证明这是由于代码碎片的糟糕情况。我拥有的用于执行插入的低级dll的源代码并不是用于生成我的项目引用的二进制文件的源代码。不同之处在于事务作用域被定义为RequiresNew。很抱歉浪费了大家的时间……它仍然可以作为一个例子,说明糟糕的版本控制可以浪费一天的工作!!
https://stackoverflow.com/questions/11897978
复制相似问题