Я очень плохо знаком с шаблоном хранилища, но пока мне нравится, как я могу его использовать.Я нашел эту реализацию в 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