使用EF6为CRUD操作实现通用服务

时间:2016-04-13 00:43:23

标签: c# entity-framework generics entity-framework-6 repository-pattern

我使用Repository模式(Interface => Repository)完成了多个项目,但现在,我正面临着一个与我的同事代码之一的新挑战(不是一个大挑战)。我们正在实现一个通用服务,该服务包含所有实体类的所有CRUD操作方法。

我们首先在这个项目中使用数据库,并具有以下结构,

  

aspx.cs> entityclass(AppUser)>通用服务>实体模型。

   public class UserServices : GenericServices<User>
   { //Implemented methods }

这是通用服务:

public class GenericServices<T> where T : class
{
    App_dbEntities _db;
    IDbSet<T> ent;

    public GenericServices()
    {
        _db = new App_dbEntities();
        ent = _db.Set<T>();
    }

    public IEnumerable<T> Select()
    {
        return ent;
    }

    public T Select(string id)
    {
        ??
    }
}

我正在尝试处理实体的属性,但由于这是Generic,它不知道当前正在处理的实体。我已经看到一些使用谓词作为函数参数的例子。请帮帮忙。

2 个答案:

答案 0 :(得分:3)

如果你想要灵活性并且愿意使用表达式作为你的谓词

public virtual T Select(Expression<Func<T, bool>> predicate)
{
    return _dbSet.FirstOrDefault(predicate);
}

用法

var service = new AppUserServices();
var appUser = service.Select(s=> s.CompositeKey1 == "some_value" && s.CompositeKey2 == "some_other_value");
var appUser2 = service.Select(s=> s.IntProperty == 100 && s.AnotherStringProperty == "some_other_value");

答案 1 :(得分:1)

同意@Thomas,您可以使用Find方法,如下所示:

public virtual T Select(params object[] keyValues)
{
  return ent.Find(keyValues);
}

通过这种方式,您还可以查找具有复合主键的实体。 我建议看一下这个codeplex project,你会发现 Repository UnitOfWork 以及 Service 模式的实现。它会给你很好的想法。