正确使用datacontext的"Using"语句

epa*_*ulk 8 c# linq-to-entities entity-framework

我正在使用Linq to Entities,最近,我发现有很多人建议将datacontext包装在一个using语句中,如下所示:

Using(DataContext db = new DataContext) {
    var xx = db.customers;
}
Run Code Online (Sandbox Code Playgroud)

这是有道理的.但是,我不确定如何在我的模型中加入这种做法.例如:我有一个接口(让我们称之为客户),它由这样的存储库实现:

namespace Models
{
    public class rCustomer : iCustomer
    {

        readonly DataContext db = new DataContext();

        public customer getCustomer(Guid id)
        {
            return db.customers.SingleOrDefault(por => por.id == id);
        }

        public iQueryable<customer> getTopCustomers()
        {
            return db.customers.Take(10);
        }

        //*******************************************
        //more methods using db, including add, update, delete, etc.
        //*******************************************

    }
}
Run Code Online (Sandbox Code Playgroud)

然后,为了利用使用,我需要将方法更改为如下所示:

namespace Models
{
    public class rCustomer : iCustomer
    {
        public customer getCustomer(Guid id)
        {
            using(DataContext db = new DataContext()) {       
                return db.customers.SingleOrDefault(por => por.id == id);
            } 
        }

        public iQueryable<customer> getTopCustomers()
        {
            using(DataContext db = new DataContext()) {       
                 return db.customers.Take(10);
            } 
        }

        //*******************************************
        //more methods using db
        //*******************************************

    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:使用"使用"的建议真的那么好吗?请注意这个变化将是一个主要的变化,我有大约25个接口/存储库组合,每个都有大约20-25个方法,更不用说完成后需要重新测试一切.还有其他方法吗?

谢谢!

埃德加.

S P*_*S P 5

您可以实现数据库工厂,这将导致您的DbContext被重用.

您可以按如下方式实现此目的:

DatabaseFactory类:

public class DatabaseFactory : Disposable, IDatabaseFactory
{
    private YourEntities _dataContext;
    public YourEntities Get()
    {
        return _dataContext ?? (_dataContext = new YourEntities());
    }
    protected override void DisposeCore()
    {
        if (_dataContext != null)
            _dataContext.Dispose();
    }
}
Run Code Online (Sandbox Code Playgroud)

Repository基类的摘录:

 public abstract class Repository<T> : IRepository<T> where T : class
{
    private YourEntities _dataContext;
    private readonly IDbSet<T> _dbset;
    protected Repository(IDatabaseFactory databaseFactory)
    {
        DatabaseFactory = databaseFactory;
        _dbset = DataContext.Set<T>();
    }

    protected IDatabaseFactory DatabaseFactory
    {
        get;
        private set;
    }

    protected YourEntities DataContext
    {
        get { return _dataContext ?? (_dataContext = DatabaseFactory.Get()); }
    }
Run Code Online (Sandbox Code Playgroud)

你的表的存储库类:

public class ApplicationRepository : Repository<YourTable>, IYourTableRepository
{
    private YourEntities _dataContext;

    protected new IDatabaseFactory DatabaseFactory
    {
        get;
        private set;
    }

    public YourTableRepository(IDatabaseFactory databaseFactory)
        : base(databaseFactory)
    {
        DatabaseFactory = databaseFactory;
    }

    protected new YourEntities DataContext
    {
        get { return _dataContext ?? (_dataContext = DatabaseFactory.Get()); }
    }

   }
    public interface IYourTableRepository : IRepository<YourTable>
   {
   }
}
Run Code Online (Sandbox Code Playgroud)

这与AutoFac构造函数注入完美结合.