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

3
我已经完成了多个使用存储库模式(接口=>存储库)的项目,但现在,我面临着一个新的挑战(不是很大)——我的一位同事的代码。我们正在实现一个包含所有实体类的CRUD操作方法的通用服务。
在这个项目中,我们使用的是数据库优先的方式,并具有以下结构:
aspx.cs => entityclass(AppUser) => Generic Service => Entity model.
   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)
    {
        ??
    }
}

我正在尝试处理实体的属性,但由于这是通用的,它不知道我现在正在处理哪个实体。我看到一些示例使用谓词作为函数参数。请帮助我。


2
你可以使用IDbSet接口的“Find”方法:return ent.Find(id) - Thomas
2个回答

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

同意@Thomas的观点,你可以像下面我展示的那样使用Find方法:

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

这样你也可以找到具有复合主键的实体。我建议看一下这个codeplex项目,你会发现它实现了仓储工作单元,以及服务模式。它会给你提供很好的思路。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接