Хотя вы уже приняли (вполне приемлемый) ответ, который затрагивает вопросы, связанные с жизнью, я думаю, что самый важный аспект был снят только в ответ Криса. Важнейшей причиной, почему (IMHO) должен быть вариант 1, является композитоспособность.(Но важным предположением является то, что в варианте 1 репозиторий получает контекст в своем конструкторе, поэтому этот контекст может использоваться несколькими репозиториями в одном случае).
Предположим, вы хотите присоединиться к двум организациям в одном запросе:
from u in repo1.GetUsers()
join r in repo2.GetRoles() on u.UserId equals r.UserId
where u.UserId = ...
С опцией 2 это будет выполнять отдельные запросы для пользователей и ролей, потому что два DbSet
s из разных контекстов могут быть объединены только в памяти. В случае с вариантом 1 (и некоторыми изменениями) это сгенерирует один скомпилированный запрос с помощью соединения SQL.
Что вам нужно сделать, сделать дополнительно, это вернуть IQueryable
в смену List
, т.е. просто вернуть context.Users
.
Кроме того, с вариантом 2, если вы вносите изменения в объекты из разных хранилищ, для их совершения в одной транзакции гораздо сложнее. (Вам нужно SaveChanges()
вызовов в каждом контексте, завернутых в TransactionScope
).
Немного не по теме, но слишком важно упустить тот факт, что измененный вариант 1, вероятно, оставит вас с очень, очень тонким посредником между DbSet
и кодом вашего приложения. Вы можете решить, что этот уровень репозитория не добавляет ничего полезного и вообще не помещает его.
Первая версия: где и когда вы создаете и удаляете контекст? –
Здесь вы можете найти информацию: http://stackoverflow.com/questions/16058769/declaring-entity-framework-contexts-with-using Надеюсь, что эта помощь. – lmt1608