Проблема с вашей настройкой заключается в том, что она просто не решает проблему под рукой. Что, кстати, является одной из проблем с большинством ОРМ.
Например:
Допустим, у вас есть таблица Projects, и вам нужно получить список проектов, статус которых Active. Вам не нужны / не нужны все поля, только название проекта, статус, дата начала и дата последнего обновления.
Как вам этого добиться в вашем макете? С самого начала ваш класс таблицы не будет работать (требуются только соединение и имя таблицы), потому что он потребует, чтобы вы извлекли все столбцы: с этой проблемой вы уже столкнулись.
Что означает, что вы должны использовать свой метод Query, чтобы получить именно то, что вы хотите ... Однако, как table
узнает, что можно изменить только столбец состояния одной строки при вызове .Save()
? Теперь вы становитесь действительно сложным, потому что для выполнения этого требуется еще один пользовательский запрос. Или, по крайней мере, вам придется внедрить отслеживание изменений в каждом столбце, и ваш engine будет достаточно умен, чтобы обновлять только те значения, которые изменились.
Теперь учтите, что подавляющее большинство ваших запросов похоже на это. Это означает, что вы хотите извлекать записи, которые обычно включают объединения, пересекающие границы таблицы, вам не нужны все столбцы (по соображениям производительности), и ваши обновления будут очень целенаправленными ... Именно здесь ORM основаны на прямом сопоставление вашей схемы с классами всегда провалит тест производительности.
Итак, что вы будете делать? Мое мнение таково, что вам нужно разделить типы доступа к данным, которые вы делаете, на два логических набора операций. Один набор будет включать в себя наличие регулярных ООП-классов для проверки и обеспечения правильного функционирования ваших бизнес-правил. Они будут использоваться при создании новых записей.
Для следующего набора вы можете использовать простые DataTables или динамические классы. Отправьте запрос в базу данных и извлеките нужные записи. Всякий раз, когда вы делаете обновление, убедитесь, что запрос имеет высокую точность. Вы можете сделать это с помощью хранимых процедур или встроенного SQL; с чем вам удобнее. Dapper на самом деле вполне подходит для этого варианта использования или просто используйте Enterprise Library с обычными SqlCommand / SqlConnections ..
Дело в том, что не создавайте свой собственный ORM, если вы не понимаете проблему с существующими.