【问题标题】:How to perform updates in entity framework 3.5 within an SqlTransaction如何在 SqlTransaction 中的实体框架 3.5 中执行更新
【发布时间】: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


    【解决方案1】:

    这只是猜测...

    数据驱动程序使用的 sql 连接与您的插件不同。因此,您的代码在不同的事务中运行(或没有事务),并且与来自数据驱动程序的未提交更改发生冲突,从而导致死锁。

    解决方案:

    • 让您的代码使用与数据驱动程序相同的连接。这将要求以某种方式将连接提供给插件。而且您需要一种使实体模型使用它的方法(我自己从未使用过实体模型)。这将是最好的解决方案。你的东西会自动参与到交易中,带来所有好的结果,比如一致性等等。
    • 尝试确保两个连接在同一个事务中运行。这在理论上可以使用System.Transactions。这也需要调整数据驱动程序以使用System.Transactions 模型。我怀疑这两个连接会以这种方式看到彼此发生变化,所以这可能行不通。
    • 不要使用事务。您也许可以指示数据库服务器忽略事务,因此您不需要更改数据驱动程序。这会奏效。当然,交易的发明是有原因的......

    我会选择第一个。弄清楚如何告诉实体模型使用特定的 sql 连接,然后请数据驱动程序开发人员将其提供给您。这甚至可能会带来更好的性能,因为需要更少的连接。

    【讨论】:

    • 这些都是正确的,但不幸的是我不能使用你的任何建议,因为它们需要修改调用数据驱动程序。
    猜你喜欢
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多