2012-11-03 56 views
0

我一直在尝试使用实体框架的代码优先。我写了下面的代码行代码优先使用DbContext

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; 
} 
} 

所示的通用库类,然后我呼吁网页加载事件,其中教师是映射到数据库中的表

一个实体类该类
protected void Page_Load(object sender, EventArgs e) 
{ 
    GenericRepository<Teacher> studentrepository = new GenericRepository<Teacher>(); 
    rptSchoolData.DataSource = studentrepository.GetAll().ToList(); 
    rptSchoolData.DataBind(); 
} 

但连接保持关闭状态,并且上下文对象的ServerVersion中还有一个InvalidOperation异常。

我错过了什么?

+0

您需要创建自己的上下文类,它从DbContext继承并定义实体集合。 – tvanfosson

+0

我的数据库已经存在与表。这是我在我已经传入DbContext对象的连接字符串中指定的内容。我仍然需要一个继承它的类吗? – RAHUL

+0

@RAHUL:是的,你需要。 – Slauma

回答

0

此属性

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

有一个沉重的气味了。与value无关的二传手是一个反模式的大好时机。您是否希望在创建GenericRepository之后设置DbSet

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

_dbsetDbSet不应该在那里摆在首位。 GetAll应该返回_context.Set<T>()。 EF应该自行打开和关闭连接。也许事实上你不初始化DbSet会导致永远不会打开连接,从而导致在这里没有显示的其他代码段出现问题。

+0

谢谢Gert为此....我在getter中初始化了_dbset,并处理了这个问题。不过,我现在有另一个问题。我得到了一个例外:“实体类型教师不是当前上下文中模型的一部分”。我忘了提及我正在使用现有的数据库,并使用数值,并且首先使用代码对其进行数据操作。我忘了什么吗? – RAHUL

+0

你最好为此提出一个新问题。这是一个不同的问题,它需要你的类模型和映射的代码。我会看看我能做什么。 –

+0

http:// stackoverflow。com/questions/13477420/code-first-generic-repository-with-existing-database-tables我在上面的链接中创建了一个新问题。请考虑一下。 – RAHUL