Вопрос

У меня есть объект домена, используемый в карте идентификации (ключи — это объект Id свойство).

Псевдокод:

map = new Mapping();
map[domainObj.Id] = 'foo';

Я наблюдаю за объектом, чтобы сообщить мне, когда он был сохранен в базе данных:

domainObj.bind('saved', function() {
    map[domainObj.Id] = 'new foo!'
})

Для новых объектов Id Поле пусто и не заполняется до тех пор, пока оно не будет сохранено в базе данных.

И в этом моя проблема.В случае новых объектов поиск "map[domainObj.Id]" не удается, поскольку идентификатор объекта изменился после сохранения!

Как лучше всего использовать объект в такой карте идентичности?

Ограничения:

  1. Я использую язык, который не позволяет использовать объекты в качестве ключей при сопоставлении [JavaScript]
  2. А Id поле должен генерироваться на сервере при сохранении нового объекта

Обновлять

Спасибо за ответ.Мне бы очень хотелось, чтобы объекты значений отображались так же, как сущности:Тот факт, что объект значения не был сохранен, не означает, что у него нет значения для сопоставления с моим приложением.На самом деле я неправильно понимаю, что такое карта идентичности (которую, после перечитывания определения шаблона, оказывается, я на самом деле не использую).

Решение, которое я придумал, практически полностью соответствует ответу Игоря:каждый объект получает случайный идентификатор, присвоенный ему при создании экземпляра.Он уникален, неизменен и неизменен в течение всего времени существования контекста, в котором живет объект.Он существует как для объектов из базы данных, так и для новых экземпляров.Настройка сущностей заключается в том, что они настроены так, чтобы соответствовать реальной идентичности объекта.Это немного упрощает отладку.Это значение я использую в качестве ключа при сопоставлении.

Это было полезно?

Решение

Пока объект не получит идентичность, это всего лишь объект значения.Только после того, как личность установлена, она становится сущность.

Пока объект не станет сущностью, вы не сможете поместить его в карту идентичности, подобную вашей — это не имеет смысла, поскольку вы не можете его вытащить (поскольку у вас нет уникального ключа, чтобы найти его).

Один из возможных подходов:

  1. Добавьте в класс флаг, указывающий состояние объекта (новый/сохраненный).
  2. Реализуйте временный (клиентский) идентификатор для этих объектов.
  3. Необязательный:
    1. хранить «новые» объекты в отдельный карта личности (если вы не могу избегать конфликтов идентификаторов между идентификаторами клиента и сервера)
    2. хранить «новые» объекты в такой же карта личности (если вы может избегать конфликтов идентификаторов между идентификаторами клиента и сервера)
  4. После сохранения объекта замените идентификатор клиента на идентификатор сервера, установите состояние «сохранено», перейдите к основной карте идентификации (при необходимости).

Смотрите здесь о сущности против.ценные объекты

Другие советы

Что ж, вам придется найти способ отложить добавление объекта на карту до тех пор, пока после он был сохранен и ему присвоен идентификатор.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top