2014-11-21 3 views
0

У меня есть EntityA, у которого есть свойство навигации EntityB. В интерфейсе можно создать новый EntityA и добавить его в EntityB. Если теперь я попытаюсь сохранить новый созданный EntityA, Breeze также захочет сохранить изменения в EntityB (содержащий новый идентификатор вновь созданного EntityA). Можно ли как-то избежать EntityB, потому что в этом конкретном случае использования должно быть возможно добавить новые сущности в EntityB, но они не должны быть сохранены (а также не будут представлены как ожидающие изменения)?Исключить модели от сохранения с помощью Breeze

Я вижу возможность использования двух EntityManager, но это будет означать, что я больше не могу иметь свойства навигации между этими двумя типами.

+0

Разве это отношения к одному? –

+0

Да, EntitiyB имеет один или нулевой EntityA, EntityA всегда имеет EntityB. –

ответ

2

Паскаль спрашивает важный вопрос: являются Предприятию A и B Entity, связанный один-к-одному? Более того, они связаны друг с другом , так что A зависит от B (то есть A является дочерним элементом B)?

Типичные отношения такого рода - это «расширение». Рассмотрим «Заказ» и «OrderExtension». «OrderExtension» - это тип болтовки с дополнительными полями, которые «расширяют» данные заказа ядра. В заказе может быть ноль или одна запись «OrderExtension».

Order является родителем в этом примере; он НЕ ДОЛЖЕН иметь ссылку FK на OrderExtension. OrderExtension является дочерним, и у него ДОЛЖНО иметь требуемое поле FK OrderID. Родитель Order может существовать без дочернего элемента, но дочерний OrderExtension не может существовать без родителя.

По крайней мере, так я и думаю. Я часто видел, как люди поворачивают это вокруг. Они дают Order поле OrderExtensionID FK, которое не является обязательным. OrderExtension не имеет обратного указателя на Order.

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

Я держу пари, что это ваша ситуация. Я уверен, что Entity B похож на OrderExtension, а Entity A похож на Order. Когда вы создали OrderExtension (B) и связали его с Order (A), Breeze попытался поддерживать эти отношения для вас, обновив свойство Order.OrderExtensionID. Это помещает Order (A) в измененное состояние.

Не продолжайте, пока не выясните это. В то время как Джереми прав, что вы можете сохранить одну сущность путем выбора вишни в ожидании изменений - вы можете сохранить B без сохранения A -, вы рискуете нарушить целостность ваших данных!

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

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

0

Вы можете передать массив, содержащий объекты, которые вы хотите сохранить, в метод saveChanges для ограничения того, какие объекты сохраняются.

От breeze docs:

SaveChanges ([лица] [SaveOptions] [вызов] [errorCallback]) асинхронной

Сохраняет либо список указанных лиц или всех измененных образований внутри этого EntityManager. Если никаких изменений в какой-либо из объектов не указано, то не будет вызова на стороне сервера, но действительный «пустой» saveResult будет возвращен.

Параметры:

[сущности] Массив Entity Необязательный список лиц, чтобы сэкономить. Каждый объект в этом списке будет отправлен на сервер, независимо от того, был ли он изменен или без изменений, если он подключен к этому EntityManager. Если этот параметр опущен, пустой или пустой (обычный случай), каждый объект с ожидающими изменениями в этом EntityManager будет сохранен.

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