Entity Framework и Repository Pattern - PullRequest
       36

Entity Framework и Repository Pattern

4 голосов
/ 23 февраля 2011

Я пытаюсь использовать шаблон Repository с EF4, и я просто не уверен, как заставить Lazy Loading работать с ним. Если я верну объект, скажем Заказчик, и я хочу иметь возможность получить его Заказы, может быть, не точно, как мне поступить об этом?

Как долго я должен позволить контексту жить? Должен ли я просто вернуться и получить коллекцию заказов?

Любые примеры будут с благодарностью !!

Спасибо!

Редактировать

Итак, если у меня есть такой репозиторий (при условии, что у меня есть классы POCO для категорий и подкатегорий):

Public Class CategoryRepository
    Implements ICategoryRepository

    Public Function GetCategories() As List(Of Category)
        Using db As New DBContext <-- Entity Framework Context
            return db.Categories.ToList()
        End Using
    End Function

End Class

А затем использовать его в Контроллере следующим образом:

Public Function Index() As ActionResult
    Dim m As New CategoryViewModel
    m.Categories = _Repository.GetCategories()

    Return View(m)
End Function

Если я попытаюсь в представлении сказать:

Category.SubCategories.Count

Он взрывается, говоря, что ObjectContext расположен.

1 Ответ

2 голосов
/ 24 февраля 2011

Если вы придерживаетесь концепции, что репозитории существуют один раз для каждого агрегата, то вы (вероятно) загрузите дерево так, как вы знаете, что вы будете его использовать, в репозитории.Поэтому для вашего примера вы бы вызвали db.Categories.Include ("SubCategories"), чтобы загрузить их.У вас также могут быть разные методы, такие как «GetCategoriesDeep ()» и «GetCategoriesShallow ()», чтобы различать, если у вас разные сценарии.

Чтобы ответить на более глубокий вопрос, контекст должен длиться для одной транзакции (однако вы определяетечто в вашем приложении).В вашем случае, как я уже сказал выше, кажется, что правильной границей для этого является вызов метода репозитория.Контроллер должен решить, запрашивает ли пользователь коллекцию без подкатегорий и затем вызвать правильный метод в репо, чтобы ответить на этот вопрос.Представление не должно иметь доступа к контексту данных (даже косвенно через ленивую загрузку).

...