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 に答える