7

我现在面临一个让我疯狂几天的问题,希望有人能帮助我。这里是 ;

我正在将 EF4 与 oracle 数据库一起使用,将 devart 的 dotConnect 用于 oracle 作为提供者。我有 wcf 服务方法,它在下面调用 DeleteCabinet 方法;

public void DeleteCabinet(string pRID)
{
    using(TransactionScope tranScope = new TransactionScope())
    {
        DBUtils.DeleteCabinetAndShelves(pRecordId);

        //throw exception to test record not deleted
        throw new Exception("xxx something has happened test xxx");

        tranScope.Complete();
    }
}

DBUtils.DeleteCabinetAndShelves 如下所示;

public void DeleteCabinetAndShelves(string pRecordId)
{
    using(var context = new EdrmEntities())
    {
        var cabinet = context.Cabinets.Include("Shelves").Single(p => p.RID == pCabinetRID);

        //mark all cabinet shelves for deletion
        if (cabinet.Shelves != null)
        {
            foreach (var tempShelf in cabinet.Shelves.ToList())
            {
                context.DeleteObject(tempShelf);
            }
        }

        //mark cabinet for deletion
        context.DeleteObject(cabinet);

        //save 
        context.SaveChanges();
    }
}

当我从我的测试项目中调用 DeleteCabinet 时,不是 wcf 调用而是直接方法调用,它工作正常。它抛出异常,事务被回滚。因此,没有按预期从数据库中删除记录

问题是,当我从客户端调用服务方法(调用 DeleteCabinet)时,抛出异常,但记录已从 db 中删除。交易不回滚!

似乎调用 wcf 方法不会回滚事务,但这似乎很疯狂(至少对我而言),有人知道这可能发生的原因吗?

提前致谢

4

2 回答 2

3

你用DevArtDotConnect标签标记了你的帖子......我想知道这是否是 DevArt 提供程序中的错误,而不是 WCF / Entity Framework / System.Transactions 固有的错误。您可以通过查看它是否发生在ObjectContext使用内置 SQL Server 提供程序(甚至是最近发布的 Oracle 自己的 EF 提供程序)的情况下来测试该理论,并查看问题是否仍然存在。这是我唯一能想到的,因为代码似乎 100% 正确。

于 2012-03-06T13:25:35.263 回答
1

感谢@Rabid 和@luksans 建设性评论问题得到解决,结果证明它与wcf 或devart 的提供者有问题无关

事情是这样的;wcf 服务(没有回滚)和集成测试(确实)在不同的项目中,因此配置文件不同。他们在过去的某个时候不同步,并且Enlist=false部分不同。所以 wcf 项目的连接字符串有Enlist=false,而测试项目没有。这就是 WCF 事务失败的错觉是如何诞生的。

Enlist=false从 wcf 项目的连接字符串中删除解决了该问题。

于 2012-03-07T08:35:42.130 回答