Entity framework 4 扩展EF实体检索方法

Entity framework 4 扩展EF实体检索方法,entity-framework-4,entity-framework-4.1,repository,Entity Framework 4,Entity Framework 4.1,Repository,我使用的是EF4.2,最初我为每个实体集推出了自己的存储库类。在调查过程中,我意识到DbContext和IDbSet实现了我所需要的工作单元和存储库模式 这非常有效,但我也希望一些“helper”方法使用常用的属性(而不是主键)返回特定的实体 例如,通过电子邮件和帐户状态而不是Id主键选择员工。我的原始用户存储库对此有一个重载 我的问题是我应该在哪里添加这个助手方法?我认为自己有几个选择: 使用此方法添加域逻辑服务类型类,该方法使用dbContext,并被其他域逻辑类和方法使用 扩展DbCont

我使用的是EF4.2,最初我为每个实体集推出了自己的存储库类。在调查过程中,我意识到DbContext和IDbSet实现了我所需要的工作单元和存储库模式

这非常有效,但我也希望一些“helper”方法使用常用的属性(而不是主键)返回特定的实体

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

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

  • 使用此方法添加域逻辑服务类型类,该方法使用dbContext,并被其他域逻辑类和方法使用
  • 扩展DbContext类以具有其他方法
  • 用自定义存储库替换IDbSet
  • 对于每个实体集,将dbContext包装在其他存储库类中,并向特定于用户的存储库类添加一个方法
    这两种方法似乎各有利弊,但我更倾向于1或2。有什么想法吗

    您可以使用自定义扩展方法并重用它:

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

    这是我的第五个选择;)我已经从我的上下文中提取了一个接口(使用T4模板),并且在我的域逻辑类中使用这个接口。我是否能够/应该将其添加到接口的签名中?这是扩展方法-它是静态的,因此不属于任何接口。
    var employee = context.Employees.Find(email, status).FirstOrDefault();