我将数据访问层抽象为集中式通用抽象类,以便我的其他类型特定类可以在不定义实现的情况下调用泛型方法。
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();
}
}
}
我的问题是如何“泛化”对employee表DbSet
列表的特定调用,特别是当它需要实例化EF实体时。
using (var db = new Entities())
{
ents = db.tblEmployees.ToList();
}
编辑:我在我将使用的抽象类中添加了另一种方法。我怎么会这样做呢?
答案 0 :(得分: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>
。
干杯 -
答案 1 :(得分: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>
答案 2 :(得分:1)
听起来你问了几个问题。首先,如果您希望实体构造函数部分是通用的,则必须向您的类添加泛型参数,可能是这样的:
public abstract class _DALMethods<TEntities, T> where TEntities : DbContext, new() where T: class
然后你可以打电话:
using (var db = new TEntities())
其次,要获得实体,您可以使用
db.Set<T>().ToList();
这将返回DbSet中的所有实体
对于你的add方法,这样的东西应该会有所帮助:
替换
db.tblEmployees.Add(obj);
与
db.Entry(obj).State = EntityState.Added;