2012-02-03 2 views
0

Я использую EF 4.2, и изначально я развернул свои собственные классы репозитория для каждого набора объектов. Когда я исследовал further, я понял, что DbContext и IDbSet реализовали единицу работы и шаблон репозитория, который мне нужен.Расширение методов поиска Entity EF

Это отлично работает, но мне бы хотелось, чтобы некоторые «вспомогательные» методы возвращали определенные объекты с использованием обычно запрашиваемых свойств, кроме первичного ключа.

Например, чтобы выбрать сотрудника по электронной почте и статус учетной записи, а не первичный ключ идентификатора. У моего исходного репозитория пользователя была перегрузка для этого.

Мой вопрос: где я должен добавить этот вспомогательный метод? Я вижу, что у меня есть несколько вариантов:

  1. Добавить класс типа службы логики домена с помощью этого метода, который использует dbContext и потребляется другими классами и методами логики домена.
  2. Расширьте класс DbContext, чтобы иметь дополнительный метод.
  3. Замените IDbSet на пользовательский репозиторий.
  4. Оберните dbContext в дополнительные классы репозитория для каждого набора объектов и добавьте метод к конкретному пользователю.

Кажется, что для каждого существуют плюсы и минусы, но я склоняюсь больше к 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), и я работаю против этого интерфейса в своих классах логики домена. Могу ли я добавить/добавить подпись к интерфейсу? –

+0

Это метод расширения - он является статическим, поэтому он не является частью какого-либо интерфейса. –