保存已删除的对象后,breeze.getEntityGraph失败

时间:2014-04-29 19:00:04

标签: breeze

**********更新屏幕拍摄**************** 在删除listitem并尝试保存其他对象时,第一个修复应用确实纠正了此问题的发生。

但是当我有两个具有相同基本类型的列表时,例如此示例中的AvailableSolidRoutes& AvailableLiquidRoutes,以AvailableRoute作为基本类型。

当我删除最后一个AvailableSolidRoute并且AvailableLiquidRoutes为空时,

GetEntityGraph失败。我知道这个结构是有效的,因为如果我调用getEntityType和getChanges传递这些类型..保存将持续存储到数据库。

因此,只有在其他列表类型为空时从任一列表类型中删除最后一项时才会发生此错误。

这是一个截屏 enter image description here

重现的步骤:

1)删除AvailableSolidRoute

2)调用datacontext.saveChanges()

3)添加AvailableLiquidRoute

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 个答案:

答案 0 :(得分:2)

我认为你遇到了一个getEntityGraph错误......我刚刚修好了。如果我对你报告的问题是正确的,那么这个函数在一个空引用而不是在一个分离的实体上绊倒(深入内部)。

查看我的updated answer here

更正的版本将出现在下一个正式版本中。你现在可以get the current getEntityGraph.js from github