breeze.getEntityGraph завершается ошибкой после сохранения удаленного объекта

********** ОБНОВЛЕНИЕ С ЭКРАНОМ СНИМКА **************** Первое примененное исправление исправило возникновение этой проблемы при удалении listitem и попытке сохранить другой объект.

Но когда у меня есть 2 списка с одним и тем же базовым типом, как в этом примере, AvailableSolidRoutes & AvailableLiquidRoutes с AvailableRoute в качестве базового типа.

GetEntityGraph завершается ошибкой, когда я удаляю последний объект AvailableSolidRoute и AvailableLiquidRoutes пусты. Я знаю, что это struture работает, потому что если я вызываю getEntityType и getChanges, передавая эти типы в... сохранение сохраняется в БД.

Таким образом, эта ошибка возникает только при удалении последнего элемента из любого типа списка, когда другой тип списка пуст.

Вот снимок экрана

Действия по воспроизведению:

1) Удалить AvailableSolidRoute

2) Вызовите datacontext.saveChanges()

3) Добавить в наличии LiquidRoute

4) Вызовите datacontext.saveChanges()

Сбой метода getEntityGraph при попытке сохранить другую сущность после успешного сохранения удаленной сущности, поскольку он все еще обнаруживает удаленную сущность, помеченную как отсоединенную.

У меня сложилось впечатление, что объект, помеченный как отдельный, не виден менеджеру

Это мой код сохранения dataContext (на стороне клиента)

        function buildEntityGraphPath(entity) {

        var graphPath;
        var drugOptionIdx = entity.drugOptions.length;


        while (drugOptionIdx--) {
            var drugOption = entity.drugOptions[drugOptionIdx];


            drugOption.availableRoute

            if (drugOption.availableRoutes.length > 0) {
                graphPath = 'drugOptions.availableRoutes';
            }

            if (drugOption.availableDrugForms.length > 0) {
                graphPath += ', drugOptions.availableDrugForms';
            }

            if (drugOption.availableUnits.length > 0) {
                graphPath += ', drugOptions.availableUnits';
            }
        }

        return graphPath;
     }

      function saveDictionaryChanges(entity) {

        var entityChanges = [];
        var graphPaths = buildEntityGraphPath(entity);

        var graph = manager.getEntityGraph(entity, graphPaths);//'drugOptions.availableRoutes, drugOptions.availableDrugForms');

        // Filter for changes only  
        graph = graph.filter(function (entity) {
            return entity.entityAspect.entityState !== breeze.EntityState.Unchanged;
        });

        return manager.saveChanges(graph)
            .then(saveSucceeded, saveFailed);

        function saveSucceeded(result) {
            //TODO: Commented out because WIP is on the back burner
            //zStorage.save();


            logSuccess('Saved Data', result, true);
        }

        function saveFailed(error) {
            var msg = config.appErrorPrefix + 'Save failed: ' +
                breeze.saveErrorMessageService.getErrorMessage(error);
            error.message = msg;

            logError(msg, error);
            throw error;

        } 

Это объекты на стороне сервера

     public class AvailableRoute {
        public int Id { get; set; }
        public int DrugOptionId { get; set; }
        public int RouteId { get; set; }
       public virtual Route Route { get; set; }
     }

    public class AvailableSolidRoute : AvailableRoute {
       public AvailableSolidRoute( ) { }
    }

   public class AvailableLiquidRoute : AvailableRoute {

      public AvailableLiquidRoute( ) { }
   }

То же самое и здесь, в итоге мы получим 5 или 6 различных типов, но пока только эти 2, пока я не заработаю. Каждый тип имеет свойства, специфичные для данного типа.

   public class DrugOption {
      public int Id { get; set; }
      public int DrugId { get; set; }
      public List<AvailableRoute> AvailableRoutes{ get; set; }
      public string SpecialInstructions { get; set; }  
   }

   public class SolidOption : DrugOption  {
     public SolidOption( ) { }
    }

   public class LiquidOption : DrugOption {
    public LiquidOption( ) { }
   }

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

   public class Drug {

    public int Id { get; set; }
    public string Name { get; set; }
    public string TextLine1{ get; set; }
    public string TextLine2 { get; set; }
    public string TextLine3 { get; set; }
    public string TextLine4 { get; set; }
    public int? DisplayOrder { get; set; }

    public List <DrugOption> DrugOptions { get; set; }

     public Drug( ) { }

  }

1 ответ

Решение

Я думаю, что вы столкнулись с getEntityGraph ошибка... которую я только что исправил. Если я прав насчет проблемы, о которой вы сообщаете, эта функция наткнулась (глубоко внутри) на пустую ссылку, а не на отдельную сущность.

Смотрите мой обновленный ответ здесь.

Исправленная версия появится в следующем официальном релизе. Вы можете получить текущий getEntityGraph.js от github прямо сейчас.

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