Время жизни Datacontext в WinForm, связывающем сценарий

Как насчет этого?

import pandas as pd

split = data["SPLIT"].apply(pd.Series)
split = split.rename(columns = lambda x : 'val_' + str(x))
split.melt(value_name="val").groupby(["val"]).size()
6
задан Christopher Edwards 19 December 2008 в 13:55
поделиться

5 ответов

Я переформулирую вашу проблему, чтобы убедиться, что я ее понял.

У вас есть виджет, который представляет список объектов (СПИСОК). Когда вы щелкаете элемент в СПИСКЕ, появляется другой виджет, который позволяет пользователю редактировать объект. Когда пользователь завершает редактирование объекта, его изменения фиксируются в БД и также должны быть отражены в СПИСОКЕ объектов. Периодически система должна также получать изменения, внесенные другими пользователями в элементы в СПИСКЕ, и обновлять СПИСОК.

Если это правильно, я собираюсь оставить в стороне любые проблемы параллелизма двух пользователей, редактирующих один и тот же объект, поскольку это не кажется вашей проблемой, и сосредоточусь на том, как организовать пользовательский интерфейс и единицу работы.

Вам нужно отделить объекты в вашем СПИСКЕ от объектов, редактируемых вашими инспекторами. Бизнес-процесс, представленный вашими инспекторами, - это ваши единицы работы, по одной единице для каждой организации. Ваш список не представляет собой единицу работы. Это устаревшее представление или момент времени объединенной работы всех ранее переданных единиц работы. Ваш СПИСОК даже не должен иметь дело с вашими объектами напрямую, он может содержать идентификатор или любой другой способ для ваших инспекторов получить базовый объект из БД, когда пользователь щелкает его. Теперь вы можете свободно обновлять список, когда захотите, поскольку ваши инспекторы вообще не делятся с ним экземплярами.

Чтобы смоделировать для вашего пользователя, что, когда он редактирует объект через инспектор, и чтобы он выглядел привязанным к одному и тому же объекту, у вас есть два варианта.

1) список привязан только к зафиксированным данным в БД . Это просто, когда инспектор сбрасывает локальные изменения обратно в базу данных и успешно фиксируется, предоставьте инспектору способ сообщить списку, что нужно обновить себя.

2) список привязан к зафиксированным данным + локальным незафиксированным данным. Это немного сложнее, вам нужно предоставить методы в вашем списке, которые позволяют инспектору перекрывать данные, возвращаемые из базы данных, и перезаписывать их своими собственными локальными грязными данными.

3
ответ дан 17 December 2019 в 18:20
поделиться

@Andronicus

После рассмотрения десятков ORMas я в настоящее время изучаю коммерческий ORM под названием Геном (http://www.genom-e.com/).

Я, кажется, позволяю мне делать больше вышеупомянутого, как более усовершенствованная привязка данных, и записям можно мешать идти устаревшие, но я все еще нахожу свой путь хотя это. Я сообщу, как я преуспеваю, но я мог бы быть когда-то.

@Reddog

Я посмотрел на BindableLinq, и мне действительно нравится он. Но это - Linq к Объектам и поэтому не имеет никакого Linq к переводам SQL насколько я могу сказать. (Если я не ошибаюсь).

Большое спасибо!

0
ответ дан 17 December 2019 в 18:20
поделиться

Возможно, немного старый... Но относительно точек 4/5 убедиться проверить Связываемый проект LINQ на CodePlex. Определенно некоторый хороший код там, который решает точно Вашу проблему.

http://www.codeplex.com/bindablelinq

0
ответ дан 17 December 2019 в 18:20
поделиться

Я в настоящее время пытаюсь реализовать идентичный сценарий в нашем приложении WinForms SmartClient.

Вы приходили к хорошему решению с этим?

В нашем приложении у нас есть то же параллельное требование UI и потребность обновить данные из общего источника, однако мы используем сервисы WCF вместо LinqToSql. Я реализовал нашу собственную карту идентификационных данных и решение для отслеживания изменений.

Очевидно важно, чтобы изменения, внесенные в Вашего клиента в инспекторе, были отражены в других представлениях. Но это отчасти производит впечатление пользователю, что их изменения были сохранены.

Я разграничил бы вокруг единицы работы для запуска, когда Вы читаете список клиентов и конец каждый раз, когда изменения пользователя были сохранены. Если Вы перечитываете список клиентов и нет никаких изменений, это - новая единица работы. Если будут изменения затем, то необходимо будет закрыть и сохранить изменения, которые внес пользователь, прежде чем можно будет запустить новую единицу работы.

Наша проблема - то, что у нас есть много окон, открытых сразу, и для пользователя легко сделать некоторые редактирования и не передать их бэкенду. Затем не очевидно, почему они не могут перезагрузить основной список.

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

Вы предлагали какие-либо лучшие решения?

0
ответ дан 17 December 2019 в 18:20
поделиться

Я пробовал аналогичный вещь, вот мои два цента.

Я не думаю, что вы можете реализовать здесь шаблон единицы работы из-за того, как работает ваш пользовательский интерфейс. Как вы, возможно, уже знаете, LinqToSql DataContext разработан как легкий и недолговечный объект. Он естественно привязывается к «единице работы». В вашем случае фиксация изменений в БД - это одна единица, обновление изменений из БД - другая единица. Но вы хотите, чтобы один экземпляр DataContext делал и то, и другое.

Также мне любопытно, что должен делать ваш пользовательский интерфейс, когда пользователь редактирует одну запись, а другой пользователь просто фиксирует некоторые изменения той же записи в БД. Как вы справляетесь с такими конфликтами параллелизма с точки зрения пользовательского интерфейса?

Возможно, вам придется пойти на компромисс с пользовательским интерфейсом. Один из способов сделать это - настроить представление сведений о клиенте в двух режимах: «отображение» и «редактирование». Отображение - это просто представление только для чтения с обновлением таймера через некоторый интервал. Редактирование - это моментальный снимок, который позволяет пользователям изменять данные, но не знает об обновлениях других людей. В конце концов, когда пользователи фиксируют обновления, пусть оптимистичный параллелизм разрешит конфликт. Пользователи не могут видеть изменения в реальном времени, когда они редактируют.

Ваш пункт №5 интересен. У нас было что-то, ничего не делающее, кроме запросов к БД для сбора последних обновлений либо на основе интервала, либо на основе некоторых сигналов. Мы назвали это «издательской службой». Чтобы это работало, вам понадобится столбец с отметкой времени в таблице БД.

Имея «службу публикации», вы можете получить набор дельты (обновления и новые записи) без использования DataContext в элементе управления клиента. Если вы «объединяете» набор дельты с вашим локальным источником данных DataBinding, ваше представление сведений о клиенте должно обновиться. Теперь экземпляр DataContext в пользовательском элементе управления предназначен для обновления. Вы можете позволить пользователю решать, когда совершать фиксацию. Или вы можете зафиксировать его, когда фокус пользователя покидает строку (во время проверки). Лично я бы сделал последнее, потому что мне не хочется, чтобы DataContext работал в течение непредсказуемого количества времени.

0
ответ дан 17 December 2019 в 18:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: