All
У меня есть требование скрыть мою реализацию EF за репозиторием. Мой простой вопрос: есть ли способ выполнить «поиск» как для DbSet, так и для DbSet.Local без необходимости иметь дело с ними обоими.
Например - у меня есть стандартная реализация репозитория с Add / Update / Remove / FindById. Я нарушаю общий шаблон, добавляя метод FindByName (только для демонстрационных целей :). Это дает мне следующий код:
Клиентское приложение:
ProductCategoryRepository categoryRepository = new ProductCategoryRepository();
categoryRepository.Add(new ProductCategory { Name = "N" });
var category1 = categoryRepository.FindByName("N");
Осуществление
public ProductCategory FindByName(string s)
{
// Assume name is unique for demo
return _legoContext.Categories.Where(c => c.Name == s).SingleOrDefault();
}
В этом примере категория 1 равна нулю.
Однако, если я реализую метод FindByName как:
public ProductCategory FindByName(string s)
{
var t = _legoContext.Categories.Local.Where(c => c.Name == s).SingleOrDefault();
if (t == null)
{
t = _legoContext.Categories.Where(c => c.Name == s).SingleOrDefault();
}
return t;
}
В этом случае я получаю то, что ожидаю, когда запрашиваю как новую запись, так и ту, которая есть только в базе данных. Но это вызывает некоторые проблемы, из-за которых я запутался:
1) Я бы предположил (как пользователь хранилища), что cat2 ниже не найден. Но он найден, и большая часть заключается в том, что cat2.Name является "Goober".
ProductCategoryRepository categoryRepository = new ProductCategoryRepository();
var cat = categoryRepository.FindByName("Technic");
cat.Name = "Goober";
var cat2 = categoryRepository.FindByName("Technic");
2) Я хотел бы вернуть общий IQueryable из моего хранилища.
Просто кажется, что нужно много работы, чтобы обернуть вызовы DbSet в хранилище. Как правило, это означает, что я что-то напортачил. Буду признателен за понимание.