2013-12-18 89 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>