【发布时间】:2011-04-21 12:48:42
【问题描述】:
我正在开发一个通过 IOC 从第三方数据驱动程序加载的插件。插件和数据驱动程序都在同一个 SQL Server 2005 数据库上运行,但插件专注于与数据驱动程序管理的表具有外键关系的一小部分表。
我的问题是,在某些操作中,数据驱动程序正在围绕对我的插件的调用创建 SQLTransaction,这导致我的操作失败(超时异常)。一个典型的场景遵循这种伪代码/代码的路径:
DataDriver.InsertEntity(IBusinessObject businessObject)
{
CreateSqlTransaction();
AddEntityToEntityTable(businessObject);
Plugin.PersistAdditionalData(businessObject);
CommitOrRollbackTransaction();
}
在我的插件中,我正在做这样的事情:
Plugin.PersistAdditionalData(IBusinessObject businessObject)
{
var dbObject = GetObjectFromDatabase(businessObject); // Via Entity Framework
var additionalData = CreateAdditionalDataObject(businessObject);
// Insert data to a table with a foreign key relationship to a table that the
// data driver has just inserted the business object data to in the current
// transaction.
_entityModel.AddToObject_AdditionalData_AssociationSet(additionalData);
_entityModel.SaveChanges();
}
我尝试将我的方法包装在 using(TransactionScope){...} 块中,但无法让它工作。但是,它确实将失败从读取 (GetObjectFromDatabase) 转移到了保存。
我无权访问数据驱动程序代码或事务已提交或回滚的任何通知。如果我知道要提出什么建议,我也许可以让开发人员进行一些更改,但我更喜欢不需要这样做的解决方案。
【问题讨论】:
标签: .net sql-server-2005 entity-framework .net-3.5 transactions