Модератор
|
|
1 | |
Пример создания приложения "Работа с комнатами в студенческих общежитиях" [WPF, SQLite, Элд Хасп]30.12.2019, 12:08. Показов 107049. Ответов 54
Метки dbcontext, dbset, entity, entity framework, mvvv, sqlite, wpf, xml, xml сериализация (Все метки)
Тема из цикла Готовые решения, примеры и рекомендации начинающим на WPF [Элд Хасп]
Создана как продолжение темы WPF, DataGridComboBoxColumn (привязка к ObservableCollection и чтение из файла) от Valius.
2
|
30.12.2019, 12:08 | |
Ответы с готовыми решениями:
54
Пример создания приложения для тестирования [WPF, Элд Хасп] DynamicResource с привязываемым ключом на примере локализации приложения [WPF, Элд Хасп, DynamicResourceBinding] Создание приложения "Штатное Расписание" в паттерне MVVM [WPF, Элд Хасп] Библиотека элементов для реализации WPF MVVM Решений [WPF, Элд Хасп] WPF команды и MVVM. Часть 1. [WPF, Элд Хасп] |
Модератор
|
|
11.02.2020, 10:14 [ТС] | 41 |
Usaga, я обдумал вариант с раздельным хранением истории.
И как-то тоже не пришёл в голову вариант, как обойти возможное нарушение в таблице Person указана одна комната, а в истории последней записью идёт другая .Думал, сделать вместо Person.RoomID - ID записи из истории, но тоже нет гарантии, что этот ID будет указывать на последнюю запись. Алгоритмически самый верный вариант, как вы и сказали, это брать последнюю (по времени) запись в истории. Для удобства, наверное, надо отсортировать записи в истории по PersonID и Timestamp (по убыванию). И тогда выбирать первую (FirstOrDefault) по PersonID запись из истории. Что касается многопользовательской работы, то SQLite её поддерживает, судя по документации. Экспериментально пока не проверил.
0
|
12061 / 8370 / 1280
Регистрация: 21.01.2016
Сообщений: 31,562
|
|
11.02.2020, 10:17 | 42 |
Это техническая возможность такого нарушения) Понятно, что вы можете озадачиться и реализовать корректное поведение, которое не даст такому случиться. Но возможность такой ошибки в будущем данной схемой базы не исключается. А как сказал однажды Мёрфи... Ну вы поняли)
Не надо. Я ранее упоминал про составной индекс включающий оба этих поля. Он как раз для этой цели. Точнее, в запросе нужно будет указать сортировку и TOP 1 (или как оно там в SQLite), но с наличием индекса такой сортировки, по сути, не произойдёт, а будет взята крайняя запись в дереве индекса. Поддерживает блокировкой всей базы целиком с помощью Lock-файла или как-то так. Т.е. это ни разу не то, что могут "взрослые" СУБД. Но SQLite таковым и не позиционируется.
1
|
Модератор
|
|
11.02.2020, 10:47 [ТС] | 43 |
Да, на время изменения (транзакции?), как я понял.
У "взрослых" блокируется только изменяемые записи. Для БД без сервера по другому, наверное, и не сделаешь. Осталось только разобраться с верификацией перед внесением изменений. Это же должна быть одна транзакция: блокировка БД, верификация, изменение, снятие блокировки. Надо разобраться как это делает SQLite.
0
|
12061 / 8370 / 1280
Регистрация: 21.01.2016
Сообщений: 31,562
|
|
11.02.2020, 10:49 | 44 |
Там всё сложнее. Уровень и "сила" блокировок сильно зависят от типа запроса и уровня изоляции транзакции. Сложная тем, на самом деле.
Что за верификация и для чего?
1
|
12061 / 8370 / 1280
Регистрация: 21.01.2016
Сообщений: 31,562
|
|
11.02.2020, 12:34 | 46 |
Элд Хасп, c EF это делается ТОЛЬКО через Concurrency Token. Других нормальных возможностей с этой ORM у вас нет.
1
|
12061 / 8370 / 1280
Регистрация: 21.01.2016
Сообщений: 31,562
|
|
12.02.2020, 06:48 | 48 |
Если в виде токена выступает уже существующее поле, то ничего не надо добавлять. В противном случае, добавлять надо. В SQL Server для этого есть специальный тип Rowversion\Timestamp (ничего общего со временем, просто автоматический счётчик), в Postgres есть скрытое поле xmin (номер транзакции внёсшей изменение). А что там в SQLite для этих целей подходит я не скажу. Но дата почти наверняка не подойдёт, ибо не хватит разрешающей способности (две команды на обновление могут прийти в одну миллисекунду).
0
|
8 / 6 / 4
Регистрация: 02.07.2019
Сообщений: 77
|
|
27.05.2020, 20:45 | 49 |
Который день перепечатываю ваш проект в ручную, сегодня встрял в этом месте. VS не хочет видеть другие проекты в решении((( Ваш, скачанный с гитХаб ошибок не пишет, а мой весь в ошибках( В чем может быть причина?
в VMClasses скопипастил даже 2 класса, ничего не помогает( Папку кэша проекта чистил, не помогает. Копирую из этой статьи, в вашем проекте на гитхаб есть отличия, но я до них не дошел еще. И сразу несколько непонятных для меня вопросов) Как я понял, DTO - это общий класс, хранимый в памяти. XML - классы нужны для сериализации/десериализации XML. Почему не сделать сразу класс, который можно сериализовать в XML? Очень сильно запутался, как такую логику только продумать можно, не то что реализовать... Так же не понял, зачем еще VM классы создавать. Уж если для XML свои классы, для БД тоже наверное свои потом будут. Почему же DTO (который хранится в памяти) сразу INPC не поддерживают? Мой проект: https://github.com/Kozlov-AE/StudentRooms
0
|
Модератор
|
|
27.05.2020, 21:04 [ТС] | 50 |
Моё Решение для Framework. ваше для Standard.
Не знаю насколько это влияет. Добавлено через 2 минуты Alessey, даже не так. У вас часть на Standard, часть на Framework. Добавлено через 1 минуту Насколько помню, проекты Framework видят Standard сборки, а наоборот - нет.
1
|
8 / 6 / 4
Регистрация: 02.07.2019
Сообщений: 77
|
|
27.05.2020, 21:09 | 51 |
Ого! Что то гдето не туда ткнул. Вроде одно исправил, думал что везде FW осталось) Огромное спасибо! Ща переделывать буду)
0
|
Модератор
|
||||||
27.05.2020, 21:27 [ТС] | 52 | |||||
У
ICopy нет public
Тоже самое у IEquatableValues Добавлено через 8 минут Это контейнер для данных: Data Transfer Object. В концепции MVVM на уровне Model в основном применяются иммутабельные DTO. Добавлено через 1 минуту Вопрос удобства и привычки. Мне удобнее сначала создать структуру данных (XML файл ил БД), а потом нужные под неё классы. Добавлено через 4 минуты Согласен. Порог вхождения для этого примера выше чем для только начинающих на C#. Он рассчитан уже на тех кто хорошо ориентируется в C#, в ООП, имеет начальное представление о шаблонах проектирования приложений, более менее освоил базис WPF. Для более начального уровня, есть примеры других приложений по ссылке в подписи моего поста. Как сделать данную задачу ещё проще... не знаю. По сути я её писал и сам по ходу продолжал изучение. Это как бы не сколько учебник, а "записи с передовой".
1
|
Модератор
|
|
27.05.2020, 21:32 [ТС] | 53 |
Потому, что когда экземпляр класса "ушёл" из Модели она теряет контроль над ним.
И если потом во вне в этом экземпляре что-то изменится, то у Модели нет инструментов узнать об этом. В результате может получится, что объект хранящийся в Модели имеет не те значения которые по мнению Модели там должны быть. Это потенциальная дорога к багам. И на практике, я уже не раз с таким сталкивался, когда помогал находить и исправлять различные баги. А такой баг ещё и очень трудно выловить. Добавлено через 2 минуты По сути такое использование DTO типов проистекает из правил SOLID.
0
|
8 / 6 / 4
Регистрация: 02.07.2019
Сообщений: 77
|
|
27.05.2020, 21:37 | 54 |
Заработало. Я уж опечалился. Копался копался, а в итоге до самого интересного мог и не дойти)
Это понятно. Вы меня спасли, буду дальше печатать и копаться) Может чего прояснится к концу проекта)
0
|
Модератор
|
|
27.05.2020, 21:40 [ТС] | 55 |
По сути такое использование DTO типов проистекает из правил SOLID.
Удачи!
Будут проблемы - не стесняйтесь обращаться. Лучше сто раз спросить, чем сделать один раз неправильно.
0
|
27.05.2020, 21:40 | |
27.05.2020, 21:40 | |
Помогаю со студенческими работами здесь
55
WPF конвертеры [Элд Хасп] WPF vs WinForms (для начинающих) [Элд Хасп] Элемент геометрии «Стрелка» [WPF, Элд Хасп] WPF команды и MVVM. Часть 2. Всплытие команд. Реализация команды для списка элементов [WPF, Элд Хасп] Обсуждение темы "Библиотека элементов для реализации WPF MVVM Решений" [WPF, Элд Хасп] Готовые решения, примеры и рекомендации начинающим на WPF [Элд Хасп] Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |