代码首先使用DbContext

时间:2012-11-03 17:31:38

标签: entity-framework ef-code-first dbcontext

我一直在尝试使用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异常。

我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

此属性

public DbSet<T> Dbset
{
    set { _dbset = _context.Set<T>(); }
    get { return _dbset; }
}

有浓重的气味。与value无关的setter是一个反模式的大时代。您是否希望在创建DbSet后设置GenericRepository

我不明白你的代码甚至可以工作,因为你从不初始化_dbset,它应该抛出一个空对象引用异常。

_dbsetDbSet不应该在那里。 GetAll应该返回_context.Set<T>()。 EF应该自己打开和关闭连接。也许您没有初始化DbSet这一事实导致连接永远不会打开,导致此处未显示的其他代码片段出现问题。