2

Из единицы шаблона работы i uderstand метод выполнения типичных транзакций на основе некоторых репоссийских доменов (с использованием репозитория на объект домена). Пример: после определения некоторых объектов репозитория в объекте UoW, передайте эти репозитории на основе состояния theyr.Является ли единица работы хорошей моделью для транзакций, которые будут автоматически генерировать новые объекты (auto_increment id)?

Также репозитории не должны содержать никакой логики транзакций.

Что происходит, когда insert() приводит к созданию нового объекта (автоматически сгенерированного идентификатора), который позже необходим другому объекту в той же транзакции?

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

Как следует обрабатывать транзакции в этом случае?

+0

Как восстановить этот идентификатор вручную перед сохранением? Какую стратегию автоматического генерации вы используете? – Hippoom

+0

Я говорю об атрибуте auto increment (секвенирование rdbms). –

+0

как последовательность Oracle? – Hippoom

ответ

2

Обычно ORM, такие как NHibernate или EntityFramework, знают, как обрабатывать порядок вызовов в БД. Например. NHibernate's inverse используется, чтобы указать, кто несет ответственность за двунаправленные отношения.

Если у вас есть собственный DataAccessLayer/ORM, вы несете ответственность за указание порядка вызова. Простейшим решением является «Добавить все новые объекты» => «Удалить все удаленные объекты» => «Обновить все грязные объекты».

После того, как объект добавлен в БД, вы можете получить в результате его @@IDENTITY/ SCOPE_IDENTITY, а затем обновить его Id, используя любое подходящее решение.

+0

Как вы можете добавить к db строку, которая имеет внешние ограничения? По-видимому, ваше решение делает временную ссылку на несуществующий идентификатор. Это обходное решение звучит не очень хорошо. –

+0

В любом случае ваше решение не подходит для сложных, вложенных объектов с автогенерацией. Сколько постоянных вызовов вы должны делать на грязных/новых объектах? Это может показаться невозможным, а не хорошим решением для сложных транзакций. –

+1

@Geo C. Я вообще не поддерживаю «временную ссылку на несуществующий идентификатор». Если строка имеет ограничения внешнего ключа, то это ограничение должно быть добавлено до (например, правильное использование NHibernates inverse решает его). Итак, ** сначала вы добавляете все ссылочные объекты, затем добавляете строку, у которой есть внешние ключи для этих объектов **. Если кто-то знает порядок звонков в БД, тогда можно сформировать правила для кода. –