【问题标题】:Implementing Generic Service for CRUD operations using EF6使用 EF6 为 CRUD 操作实现通用服务
【发布时间】:2016-08-03 20:25:56
【问题描述】:

我已经使用存储库模式(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)
    {
        ??
    }
}

我正在尝试处理实体的属性,但由于这是通用的,它不知道目前正在处理什么实体。我见过一些使用谓词作为函数参数的例子。请帮我一把。

【问题讨论】:

  • 可以使用IDbSet接口的Find方法:return ent.Find(id)

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


【解决方案1】:

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

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");

【讨论】:

    【解决方案2】:

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

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

    这样您还可以找到具有复合主键的实体。 我建议看看这个codeplex project,你会发现 RepositoryUnitOfWorkService 模式的实现。它会给你很好的想法。

    【讨论】:

      猜你喜欢
      • 2023-03-20
      • 2019-12-15
      • 1970-01-01
      • 1970-01-01
      • 2015-09-30
      • 2021-10-22
      • 1970-01-01
      • 2018-11-08
      • 1970-01-01
      相关资源
      最近更新 更多