0

データ アクセス オブジェクトと、ループから呼び出されるData署名付きのこのデータ アクセス オブジェクトのメソッドが与えられた場合、ループからの呼び出しごとに EF データ コンテキストを作成するのではなく、EF データ コンテキストを再利用する最善の方法は何ですか?public void GetEntityAttributesValues(int sessId, int entId)foreach

ループ:

foreach (var ord in Data.Entities.Where(m => m.SessionId == CurrentSessionId))
    {
        Data.GetEntityAttributesValues(sid, ord.Id);
        ...
    }

方法:

    public void GetEntityAttributesValues(int sessId, int entId)
    {
        var tsOptions = new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted };
        using (var scope = new TransactionScope(TransactionScopeOption.Required, tsOptions))
        {
            using (var context = new MyDataEntities(MyDataConnection))
            {
                var attVals = context.OrderAttributeValues.Where(a => a.SessionId == sessId
                    && a.OrderId == entId).ToList();
                foreach (var attVal in attVals)
                {
                    var att = Attributes.Single(a => a.Key == attVal.AttributeId);
                    AttributeValues[att.Value] = attVal.AttributeValue;
                }
                scope.Complete();
            }
        }
    }

したがって、このメソッドがループから呼び出されるたびに using ブロック内に新しいコンテキストを作成する代わりに、データ コンテキストを再利用したいと思います...

4

1 に答える 1

0

IoC のような構造マップ ( https://github.com/webadvanced/Structuremap-MVC3 ) を設定した後、次のようにリポジトリを使用できます。

public class DatabaseFactory : Disposable, IDatabaseFactory 
{
    private DatabaseContext _database;
    public DatabaseContext Get() {
        return _database ?? (_database = new DatabaseContext());
    }
    protected override void DisposeCore() {
        if (_database != null)
            _database.Dispose();
    }
}

public class FooRepository : IFooRepository {
    private readonly DatabaseContext _database;
    private readonly IDatabaseFactory _databaseFactory;
    private readonly IDbSet<Foo> _dbset;
    public MyRepository (IDatabaseFactory databaseFactory) {
        _databaseFactory = databaseFactory;
        _database = _database ?? (_database = _databaseFactory.Get());
        _dbset = _database.Set<Foo>();
    }
    protected DatabaseContext Database {
        get { return _database; }
    }
    public virtual void Add(Foo entity) {
        _dbset.Add(entity);
    }

}

于 2012-07-05T23:35:58.550 に答える