Как использовать хранилища данных - PullRequest
0 голосов
/ 10 марта 2011

Я очень плохо знаком с шаблоном хранилища, но пока мне нравится, как я могу его использовать.Я нашел эту реализацию в codeplex.Мои вопросы сейчас:

правильно ли я использую шаблон хранилища?

и

Может кто-нибудь предложить лучшее решениедля моего примера ниже?

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


using (var repo = RepositoryHelper.GetLocationRepository())
using (var repo2 = RepositoryHelper.GetUserRepository(repo.UnitOfWork))
{
    repo.Add(location);
    repo.UnitOfWork.Context.ObjectStateManager.ChangeObjectState(location, EntityState.Modified);

    foreach (var user in location.Users)
    {
        repo2.Add(user);
        if (user.Id != 0)
        {
            repo2.UnitOfWork.Context.ObjectStateManager.ChangeObjectState(user, EntityState.Unchanged);
        }
    }

    foreach (var user in _remove.Where(user => user.Id != 0))
    {
        repo2.Delete(user);
    }

    repo2.UnitOfWork.Commit();
}

Пример работает, хотя я очень смущен тем, каккоманда Присоединить.Я думал, что это используется, если объект происходит из другого контекста ?!Но если я пытаюсь это сделать, я всегда получаю исключение, что объект используется другим контекстом.И скажем, я отключаю местоположение, я не могу получить доступ к коллекции пользователей сразу после этого.

Другой вопрос (и я думаю, что он тесно связан с этим): я всегда читал, что соединение с базой данных должно быть как можно короче.Для этого я добавил интерфейс IDisposable в репозитории, чтобы я мог использовать их так же, как ObjectContext.Однако я нашел несколько примеров (я думаю, также в рамках приложения wpf), где это не обычный подход.Итак, за какими словами я должен следовать?

С уважением,

matt

1 Ответ

1 голос
/ 10 марта 2011

Ключевой вопрос: почему вы хотите использовать шаблоны хранилища и единицы работы (UoW)?

Люди обычно используют эти шаблоны для отделения кода EF от внутреннего хранилища и реализации UoW.Поэтому верхние уровни будут полностью независимы от EF.

Ваша реализация не обеспечивает такое разделение.Это просто странная оболочка вокруг ObjectContext и ObjectSet.В таком случае вам вообще не нужны репозиторий и UoW, и вы можете использовать классы EF напрямую.Даже с помощью классов EF вы можете сделать свой код тестируемым (еще одна неправильная причина, по которой люди иногда вводят репозитории и UoW).

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

...