0

私はこのようなコードを持っています:

public abstract class DataContextBase
{
    public DbContext DbContext { get; protected internal set; }
    public ObjectContext ObjectContext { get; protected internal set; }
    protected DbTransaction transaction;

    protected void SetContext(DbContext db, ObjectContext oc)
    {
        DbContext = db;
        ObjectContext = oc;
    }

    public void BeginTransaction()
    {
        if (ObjectContext.Connection.State != System.Data.ConnectionState.Open)
        {
            ObjectContext.Connection.Open();
        }
        transaction = ObjectContext.Connection.BeginTransaction();
    }

    public void CommitTransaction()
    {
        try
        {
            transaction.Commit();
        }
        finally
        {
            transaction = null;
            ObjectContext.Connection.Close();
        }
    }

    public void RollbackTransaction()
    {
        try
        {
            transaction.Rollback();
        }
        finally
        {
            transaction = null;
            ObjectContext.Connection.Close();
        }
    }

    public void Save()
    {
        DbContext.SaveChanges();
    }
}

これはサンプル アプリケーションからのもので、これをアプリケーションのメイン データ コンテキストの基本クラスとして使用します。私はEntity Framework 5を使用しています.DbContextのSaveChangesメソッドを呼び出すと、常にデータベーストランザクションで実行され、トランザクションをロールバックする必要がある場合に例外がスローされ、この場合、変更はありません.データベースに保存されます。

しかし、サンプル アプリケーションでは、DataContextBase.Save が呼び出されても (DbContext.変更内容を保存())。

DbContext.SaveChanges 呼び出しの組み込みトランザクションをラップする余分なトランザクションがあるようです。

この余分なトランザクションが必要な状況はありますか?

注: DataContextBase の ObjectContext は、次のトリックを使用して DbContext から取得されます。

((IObjectContextAdapter)this).ObjectContext; // inside the DbContext class
4

1 に答える 1

2

ObjectContext/DbContextUnit of Work を実装しているため、余分なトランザクションを持つことは冗長です。データベースと通信する他の手段があり、それらもトランザクションの一部である必要がある場合は、TransactionScope.

接続管理も EF によって行われ、その必要はありません。

于 2012-09-07T06:29:44.270 に答える