麻烦完全抽象数据访问方法

时间:2013-12-18 14:30:07

标签: c# .net generics abstract-class

我将数据访问层抽象为集中式通用抽象类,以便我的其他类型特定类可以在不定义实现的情况下调用泛型方法。

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

编辑:我在我将使用的抽象类中添加了另一种方法。我怎么会这样做呢?

3 个答案:

答案 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;