2012-02-03 102 views
0

我使用EF 4.2,最初我为每个实体集推出了自己的存储库类。正如我调查further我意识到,DbContext和IDbSet实现了我需要的工作单元和存储库模式。扩展EF实体检索方法

这很好,但我也想用一些“助手”方法来返回使用除主键以外的常用请求属性的特定实体。

例如,通过电子邮件和帐户状态而不是Id主键选择员工。我的原始用户存储库有这个重载。

我的问题是我应该在哪里添加这个辅助方法?我认为自己有以下几种选择:

  1. 添加一个域逻辑服务类型类,该方法使用dbContext,并被其他域逻辑类和方法使用。
  2. 扩展DbContext类以具有其他方法。
  3. 用自定义存储库替换IDbSet。
  4. 将dbContext包装在每个实体集的其他Repository类中,并将方法添加到用户特定的方法中。

似乎每个人都有优点和缺点,但我更倾向于1或2。任何想法?

回答

1

可以使用自定义扩展方法和重用:

public static IQueryable<Employee> Find(this IQueryable<Employee> query, 
             string email, string status) 
{ 
    return query.Where(e => e.Email == email && e.Status == status); 
} 

现在,您将使用它只是想:

var employee = context.Employees.Find(email, status).FirstOrDefault(); 
+0

那是我的第五个选项;)我已经提取的界面与我上下文(使用T4模板),我正在使用我的域逻辑类中的这个接口。我可以/应该将它添加到界面的签名中吗? – 2012-02-03 17:50:28

+0

这是扩展方法 - 它是静态的,所以它不是任何接口的一部分。 – 2012-02-03 17:53:09