2010-06-15 3 views
4

Я ищу хороший справочник по правильному методу использования Linq to Sql вместе с WPF.Правильный способ использования Linq с WPF

Большинство руководств относятся только к основным принципам, например, как показывать данные из базы данных, но никто из них не нашел, как сохранить обратно в базу данных. Можете ли вы ответить или указать мне руководство, которое может ответить на эти вопросы.

У меня есть отдельный проект Data, потому что те же данные также будут использоваться на веб-странице, поэтому у меня есть метод репозитория. Это означает, что у меня есть отдельный класс, который использует DataContext, и есть такие методы, как GetAllCompanies() и GetCompanyById (int id).

1) Где есть коллекции, лучше всего вернуться в качестве IQueryable или я должен вернуть список?

Внутри проекта WPF я видел рекомендации об обертке коллекции в ObservabgleCollection.

2) Почему я должен использовать ObservableCollection, и я должен использовать его даже с Linq/IQueryable

Некоторые свойства Linq лиц должны быть доступны для редактирования в приложении, так что я поставил их в режим двунаправленной. Это изменит объект в наблюдаемом наборе.

3) Является ли объект в ObservableCollection еще экземпляр исходного LinQ объекта и так это изменение отражается в базе данных (если SubmitChanges называется)

я должен somekind из метода сохранения в хранилище. Но когда мне это называть? Что произойдет, если кто-то редактирует поле, но решает не сохранять его, переходит к другому объекту и редактирует его, а затем нажмите «Сохранить». Не сохраняет ли исходное изменение? Когда он больше не запоминает изменения объекта объекта linq. Должен ли я экземпляр класса Datacontext в каждом методе, поэтому он теряет область действия.

4) Когда и как вызвать метод SubmitChanges

5) Должен ли я иметь DataContext в качестве переменной-члена класса репозитория или переменной метода

Чтобы добавить новую строку, я должен создать новый объект в событии («новое» нажатие кнопки), а затем добавьте его в базу данных с помощью метода репо.

6) Когда я добавляю объект в базу данных, в ObservableCollection не будет нового объекта. Я как-то обновляюсь.

7) Я не буду повторно использовать окно редактирования при создании нового, но не уверен, как динамически менять ссылку на выделенный элемент из списка на этот новый объект. Любые примеры, которые вы можете указать.

ответ

1

Много вопросов! Я отвечу несколько.

1) Используйте IQueryable всякий раз, когда вы хотите выполнить запрос LINQ на нем. Также предпочтительнее использовать ключевое слово 'var' вместо указания типа.

2) ObservableCollection предоставляет механизм уведомления всякий раз, когда изменяется количество элементов в коллекции. Таким образом, элемент управления списком может обновляться каждый раз, когда изменяется коллекция.

ПРИМЕЧАНИЕ: вам необходимо реализовать интерфейс INotifyPropertyChanged, чтобы уведомлять изменения свойств для отдельных объектов в коллекции.

3) Я рекомендую не хранить объекты LINQ непосредственно в коллекции. Причина в том, что если вы хотите распространять изменения в базу данных, вы должны оставить открытым DataContext, из которого был создан этот объект. Это держит соединение открытым и не рекомендуется.

4) Когда вы хотите внести изменения в базу данных, создайте новый DataContext, выберите объекты, которые хотите изменить, измените их свойства и вызовите метод SubmitChanges(). После этого закройте DataContext.

5) Как я уже сказал, создайте новый экземпляр DataContext всякий раз, когда вы хотите выбрать объекты из базы данных или отправить изменения обратно в базу данных.

+0

Итак, я должен создавать классы ViewModel для каждой таблицы в базе данных? Затем, когда он изменился, мне нужно снова получить исходный объект, изменить его, чтобы он соответствовал viewModel, а затем сохранил его. Это много кода и, похоже, отрицает многие из хороших качеств привязки linq и WPF. –

+0

Правильно. Но чтобы сохранить некоторое кодирование, вы можете использовать объекты LINQ в качестве бизнес-объектов, но как только вы закроете DataContext (который должен быть закрыт как ASAP), они не смогут распространять изменения обратно в базу данных. Вам нужно будет выбрать новый объект из нового DataContext, скопировать все свойства из старого в новый и вызвать SubmitChanges(). Вы также можете ознакомиться со следующими ссылками: http://www.codeproject.com/KB/linq/linq-to-sql-detach.aspx http://www.plinqo.com/ И http: //www.plinqo.com/entity-enhancements.ashx – decyclone

+0

Хорошо подумайте о создании классов ViewModel для каждой сущности/db-таблицы. Этот класс ViewModel может обрабатывать сохранение объекта обратно в db, например. Если я позволю этим классам реализовать INotifyPropChange, мне не нужно помещать его в ObservableCollection. Также я их не наследую от какого-то базового класса. Является ли это шаблоном дизайна, который обычно используется, и есть ли где-нибудь, что я могу прочитать об этом? –

Смежные вопросы