1

我正在使用 TransactionScope 来测试数据库操作。这是测试类:

// Test class

private TransactionScope _transactionScope = null;

[TestInitialize]
public void Initialize()
{
    _transactionScope = new TransactionScope();
}

[TestCleanup]
public void Cleanup()
{
    if (_transactionScope != null)
    {
        _transactionScope.Dispose();
        _transactionScope = null;
    }
}

[TestMethod]
[DeploymentItem("Db.sdf")]
public void AddToPresentationsTest()
{           
    var item = TestItem();
    var db = new DbEntities();
    var target = new DatabaseController {Entities = db};
    target.AddToItems(item);
    var result = db.Items.Any(p => p.Text.Equals(item.Text));
    Assert.IsTrue(result);
}

TransactionScope 在每次测试之前创建,并在测试完成后处置。当调用 AddToItems 方法时,我收到以下错误:

System.Data.EntityException: The underlying provider failed on Open. ---> System.InvalidOperationException: The connection object can not be enlisted in transaction scope.

DatabaseController 具有以下代码:

// DatabaseController class

private DbEntities _entities;

public DbEntities Entities
{
    get { return _entities ?? (_entities = new DbEntities());}
    set { _entities = value; }
}

protected override void Dispose(bool disposing)
{
    if (disposing && _entities != null)
    {
        _entities.Dispose();
    }
    base.Dispose(disposing);
}

public void AddToItems(Item item)
{
    Entities.Items.Add(item);
    Entities.SaveChanges();
}        

我使用 Sql Server Compact 4.0。你能指出我做错了什么吗?

4

1 回答 1

3

猜测一下,TransactionScope 需要升级为分布式或嵌套事务,CE 都不支持这两种事务。

这可能会发生,例如因为同时打开了多个连接 - TransactionScope 和 SQL Server Compact

然而,CE 确实支持轻量级事务,因此理论上只要您的所有连接都使用相同的连接字符串,并且您在打开另一个连接之前关闭每个连接,TransactionScope就不应该升级为分布式。

于 2012-07-19T05:25:32.657 回答