2013-12-18 90 views
1

我將我的數據訪問層抽象爲集中的通用抽象類,以便我的其他類型特定類可以在不定義實現的情況下調用泛型方法。完全抽象數據訪問方法的問題

public abstract class _DALMethods<T> 
{ 
    public virtual List<T> GetAll() 
    { 
     List<T> ents = new List<T>(); 

     using (var db = new Entities()) 
     { 
      ents = db.tblEmployees.ToList(); 
     } 

     return ents; 
    } 

    public virtual void Add(T obj) 
    { 
     using (var db = new Entities()) 
     { 
      db.tblEmployees.Add(obj); 
      db.SaveChanges(); 
     } 
    } 
} 

我的問題是「通用-ISE」 EMPLOYEE表DbSet列表非常具體的電話,怎麼尤其是當它需要EF實體的實例。

using (var db = new Entities()) 
{ 
    ents = db.tblEmployees.ToList(); 
} 

編輯:我添加另一種方法,我將使用的抽象類。我怎麼會這樣做呢?

+0

根據您的更新是同樣的事情。 –

回答

1

聽起來像你問幾個問題。首先,如果你想在實體構造的部分是通用的,你必須一個通用的參數添加到您的類,也許是這樣的:

public abstract class _DALMethods<TEntities, T> where TEntities : DbContext, new() where T: class 

然後,您可以撥打:

using (var db = new TEntities()) 

其次,得到實體一般可以使用

db.Set<T>().ToList(); 

將返回所有的實體從DbSet

你的附加組件的方法,這樣的事情應該有所幫助:

更換

db.tblEmployees.Add(obj); 

db.Entry(obj).State = EntityState.Added; 
+0

我收到了很多錯誤當我執行這個。'TEntities必須轉換爲IDisposable'和'不能創建TEntities的實例,因爲它沒有新的()約束' – Lee

+0

對不起,忘了將約束添加到類 –

+0

這太棒了。 'TModel'指的是什麼? – Lee

3

看起來像這可能工作:

List<T> ents = new List<T>(); 

using (var db = new Entities()) 
{ 
    //ents = db.Set<T>().ToList(T); 
    // correction due to Kyle and Lee below 
    ents = db.Set<T>().ToList<T>(); 
} 

return ents; 

(我使用EF 6)。 Set<T>返回DbSet<T>

乾杯 -

+0

'T'不能用作ToList的參數。另外,對於ents的第一個賦值是不必要的(ents要麼被覆蓋,要麼拋出異常,並且執行永遠不會返回到return語句)。 – Kyle

+0

@Kyle是對的我在嘗試這樣的時候得到錯誤:'T是一個類型並且被用作變量'並且'類型T必須是引用類型才能用它作爲參數' – Lee

+0

道歉:那應該是ToList (); –

3

好像你正在尋找的DbContext.Set<T>()方法:

public virtual List<T> GetAll() 
{ 
    using (var db = new Entities()) 
    { 
     return db.Set<T>().ToList(); 
    } 
} 

則:

var dal = new _DALMethods<Employee>(); 
var employees = dal.GetAll(); // returns a List<Employee>