Ветерок: неожиданная ошибка в getEntityGraph

Я использую расширение getEntityGraph, и оно отлично работает, за исключением следующего сценария:

  1. добавить новый объект
  2. не сохраняйте его и не вызывайте setDeleted для объекта
  3. вызовите getEntityGraph, передав в качестве параметров сущность и коллекцию np

Когда вызывается makePathSegmentFn, он вылетает в этой строке:

 grps.forEach(function(grp) {
     vals = vals.concat(grp._entities.filter(function (en) {
       return en.getProperty(fkName) === keyValue;         
   }));
 });

en имеет значение null, поэтому возникает исключение. Я обошел проблему, проверив, является ли en нулевым, и каждый, кажется, работает нормально. Но, возможно, это должно быть сделано в оригинальном коде, если это ошибка? Обратите внимание, что только один объект является нулевым среди всех объектов в коллекции np. Я думаю, что это тот, который был удален, но не могу сказать наверняка.

1 ответ

Решение

Обновление 29 апреля 2014

ОК... Теперь я понял. Вы говорите об удаленной дочерней сущности, а не об отделенной корневой сущности.

Спасибо за выявление этой ошибки. Я добавил тест для этого сценария в DocCode, затем исправил ошибку. Оба изменения перенесены в github. Они появятся в следующем официальном релизе. Вы можете получить текущий getEntityGraph.js от github прямо сейчас.

Оригинальный ответ

Я не могу дублировать конкретную ошибку, которую вы описываете... потому что getEntityGraph бросает задолго до того, как доберется до makePathSegmentFn... как и должно быть!

getEntityGraph должен выдать исключение (например, " getEntityGraph root[0] является отделенной сущностью "), когда любая из корневых сущностей, переданных в это "Detached".

Когда вы создаете новую сущность и немедленно удаляете ее (не сохраняя сначала), ее состояние изменяется с "Добавлено" на "Отдельно"; это больше не сущность в кеше. Это ожидаемое поведение (см. "Переходы EntityState" в разделе документации "Внутри Entity"). Вот что происходит, когда я точно следую твоим действиям.

Пожалуйста, предоставьте jsFiddle или plunker, который демонстрирует ошибку.

Другие вопросы по тегам