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个方法,更不用说完成后需要重新测试一切.还有其他方法吗?
谢谢!
埃德加.
您可以实现数据库工厂,这将导致您的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构造函数注入完美结合.