2012-11-03 53 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