【发布时间】:2016-08-14 00:41:13
【问题描述】:
如果有一个类作为数据访问层,并为实体提供 CRUD 操作的功能,在考虑性能和多线程环境时哪个版本是最佳实践(即此类的方法由多个线程调用同时 。 。)。 . .
版本 1:
在类级别创建的 DbContext,由所有方法共享。 .
class EmployeeService{
private DbContext db=new DbContext();
public Employee GetEmployee(int id)
return db.Employees.Find(id);
}
public void AddEmployee(Employee employee){
db.Employees.Add(employee);
db.SaveChanges();
}
}
版本 2:
每个方法调用的 DbContext。 .
class EmployeeService{
public Employee GetEmployee(int id){
using(DbContext db=new DbContext()){
return db.Employees.Find(id);
}
}
public void AddEmployee(Employee employee){
using(DbContext db=new DbContext()){
db.Employees.Add(employee);
db.SaveChanges();
}
}
}
更新: 可能是发布的问题范围过于笼统,导致需要考虑几点。
兴趣点是,实例化 DbContext 对象的成本。 它可以根据请求创建(版本 2)还是重量级对象,最好创建少量实例并在不同的实例之间共享它们调用(版本 1)
【问题讨论】:
-
以上都不是。您设置它的方式是不可测试的,并且返回模型的实体不是一个好主意。根据特定需求转换为更小的 DTO。例如,您的 GetEmployee 转换为数据存储中的 SELECT * 等效项。您真的在每种方法中都需要它吗?我会选择并改进选项 2。
-
V2 更适合多线程,EF 上下文不应该被共享。 stackoverflow.com/a/6126669/3142139
标签: c# entity-framework entity-framework-6