2014-12-14 1 views
0

Я пишу простой генератор кода в C# для автоматизации общих задач в приложениях бизнес-процессов, таких как привязка данных, моделирование и создание модели изображений и обновление записей.Каков наилучший способ реализации обновлений записей на ORM?

Сгенерированный код использует преобразователь данных, который реализует equallity путем сравнения ссылок (без id) и свойств флага для состояния переходного процесса (если объект был создан, но не сохраняется).

Для обновления свойств объекта У меня есть 3 варианта:

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

  • Mantain a Frozen state на всех объектах, которые предотвратили бы любые свойства, а также методы BeginModification и EndModification, который позволит включить средства создания свойств и ОБНОВИТЬ все измененные столбцы в EndModification. Это требует, чтобы программист вызывал эти методы, которые нежелательны для генератора кода, поскольку его простота и простота в применении к программному обеспечению являются его основной целью.

  • Mantain таймер для каждого объекта (который может быть реализован как глобальный таймер и локальный счетчики) и давать определенное «грязное время» сущностям, когда свойство задано, его грязное время сбрасывается до 0 и когда его локальные часы получают определенные значения, будут созданы столбцы UPDATE. Для этого не требуется никакого внешнего кода конечного программиста и woud group несколько наборов свойств в одном UPDATE, потому что наборы свойств contiguos имеют почти 0 раз между ними.

Подход таймера может быть объединен с методом CommitChanges, который будет называть UPDATE немедленно при желании

Моего Предпочитаемым способом является локальным загрязнен таймером, так как вешать нулевое вмешательства программиста, кроме наборов свойств, вопрос is: Возможно, что этот таймер aproach приведет к несогласованности данных?

+0

Я не совсем понимаю вашу идею таймера. Почему нужен таймер? –

+0

Imo, если вы можете использовать Microsoft Sql Server, то проект базы данных Visual Studio SQL вместе с PetaPoco - лучшая система, которую вы можете построить с помощью современных технологий без необходимости изобретать любые колеса.Проект базы данных в visual studio позволяет вам 100% контролировать ваши таблицы SQL/хранимые процедуры и т. Д., И это позволяет вам легко развернуть его и обрабатывать обновления/слияния схемы для вас. И peta poco, вероятно, самый быстрый (микроорм), который вы можете использовать. Мы используем этот подход и TT-шаблоны петапоко для создания наших pocos. –

+0

Таймер предназначен для устранения необходимости метода CommitChanges, теперь я понимаю, что это плохая идея и что изменения данных должны быть сделаны явно. Сгенерированный код уже работает бок о бок с Entity Framework и SqlServer .net api и поддерживает схемы схемы базы данных (только таблицы и хранимые процедуры). Поскольку цель состоит в создании многоплатформенного и многорежимного кода RDBMS, мы решили создать нашу собственную простую, но функциональную ORM, чтобы работать со схожими слоями данных на всех из них – rafael

ответ

1

Если вы пишете это как учебное упражнение или как средство для дальнейшего оттачивания своих дизайнерских навыков, тогда здорово! Если вы пишете это, потому что вам действительно нужен ORM, я бы предположил, что смотреть на один из многих существующих ORM будет гораздо более мудрой идеей. В этих продуктах - Entity Framework, NHinbernate и т. Д. - уже есть люди, предназначенные для их поддержки, поэтому они обеспечивают гораздо более эффективный вариант, чем попытка свернуть собственный ORM.

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

+0

Спасибо !, тогда будет явное коммит. – rafael

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