我一直在尝试使用Entity Framework的Code First。我写了下面的代码行
DbContext _context = new DbContext(ConfigurationManager.ConnectionStrings["con"].ConnectionString);
但是在执行时,连接仍然关闭。这段代码有问题吗?
我使用下面显示的DBContext创建了一个通用存储库类
public class GenericRepository<T> where T:class
{
public DbContext _context = new DbContext(ConfigurationManager.ConnectionStrings["con"].ConnectionString);
private DbSet<T> _dbset;
public DbSet<T> Dbset
{
set { _dbset = _context.Set<T>(); }
get { return _dbset; }
}
public IQueryable<T> GetAll()
{
return Dbset;
}
}
然后我在页面加载事件上调用此类,其中Teacher是一个映射到数据库中的表的实体类
protected void Page_Load(object sender, EventArgs e)
{
GenericRepository<Teacher> studentrepository = new GenericRepository<Teacher>();
rptSchoolData.DataSource = studentrepository.GetAll().ToList();
rptSchoolData.DataBind();
}
但是连接仍然关闭,并且在上下文对象的ServerVersion中也存在InvalidOperation异常。
我错过了什么吗?
答案 0 :(得分:0)
此属性
public DbSet<T> Dbset
{
set { _dbset = _context.Set<T>(); }
get { return _dbset; }
}
有浓重的气味。与value
无关的setter是一个反模式的大时代。您是否希望在创建DbSet
后设置GenericRepository
?
我不明白你的代码甚至可以工作,因为你从不初始化_dbset
,它应该抛出一个空对象引用异常。
_dbset
和DbSet
不应该在那里。 GetAll
应该返回_context.Set<T>()
。 EF应该自己打开和关闭连接。也许您没有初始化DbSet这一事实导致连接永远不会打开,导致此处未显示的其他代码片段出现问题。