【问题标题】:Collection navigation properties may NOT be set不能设置集合导航属性
【发布时间】:2013-04-15 16:13:07
【问题描述】:

我一直在构建我的第一个 SPA 应用程序,从 John Papa 的出色工作开始。

我遇到的问题是,当我尝试通过微风执行扩展或简单地选择所有字段时,在映射我的子集合时,微风出现了问题。 newValue.entityAspect 未定义

如果我通过我的 api 通过 select 子句进行查询,一切都很好,如果我直接调用表,直接“位置”,我会在 chartVal 对象上得到导航错误。

var query = EntityQuery.from('Positions')
           //.select('id, endDate, gauge, hoursPerWeek, memberId, title, summary, startDate, totalHours, weightedHours, company, compensation')
             .where('memberId', '==', id)
             .expand('Company, ChartVals')
             .orderBy(orderBy.positions);

            return manager.executeQuery(query)
                .then(querySucceeded)
                .fail(queryFailed);

            function querySucceeded(data) {
                var list = partialMapper.mapDtosToEntities(manager, data.results, entityNames.position, 'id');
                if (observables) {
                    observables(list);
                }

上面的查询会成功,然后调用 MapDtosToEntities(由 John Papa 提供)

function mapDtosToEntities(manager, dtos, entityName, keyName, extendWith) { 返回 dtos.map(dtoToEntityMapper);

        function dtoToEntityMapper(dto) {
            var keyValue = dto[keyName];
            var entity = manager.getEntityByKey(entityName, keyValue);
            if (!entity) {
                // We don't have it, so create it as a partial
                extendWith = $.extend({ }, extendWith || defaultExtension);
                extendWith[keyName] = keyValue;
                entity = manager.createEntity(entityName, extendWith);
            }
            mapToEntity(entity, dto);
            entity.entityAspect.setUnchanged();
            return entity;
        }

        function mapToEntity(entity, dto) {
            // entity is an object with observables
            // dto is from json
            for (var prop in dto) {
                if (dto.hasOwnProperty(prop) && prop !="entityAspect") {
                    entity[prop](dto[prop]); <-- tanks here on children
                }
            }
            return entity;
        }
    }


/// <summary>
/// TODO: Update summary.
/// </summary>
public class Position : PersistableObject
{
    public int CompanyId { get; set; }

    /// <summary>
    /// Weighted hours based on Half-Life.
    /// </summary>
    public int CreditMinutes { get; set; }

    public int? CompensationId { get; set; }

    public DateTime? EndDate { get; set; }
    /// <summary>
    /// Code to hold measure of completeness. 10 = complete 0 = not complete.  
    /// </summary>
    public int Gauge { get; set; }

    public int? HoursPerWeek { get; set; }

    public bool IsCurrent { get; set; }

    [StringLength(40)]
    public string LinkedInId { get; set; }

    [Required]
    public int MemberId { get; set; }

    [StringLength(40)]
    public string Title { get; set; }

    [StringLength(400)]
    public string WeightedWords { get; set; }

    /// <summary>
    /// Adjusted Experience score Based on half life
    /// </summary>
    public int Score { get; set; }

    [Required]
    [StringLength(2000)]
    public string Summary { get; set; }

    public DateTime StartDate { get; set; }

    public decimal? SalaryEnd { get; set; }

    /// <summary>
    /// Hourly salary - let users enter hourly, monthly, annual etc
    /// </summary>
    public decimal? SalaryStart { get; set; }

    public decimal TotalHours { get; set; }

    /// <summary>
    /// Total Man-hours Multiplied by Gauge reading
    /// </summary>
    public decimal WeightedHours { get; set; }

    public int VisibilityId { get; set; }

    public Company Company { get; set; }

    public Member Member { get; set; }

    public virtual Compensation Compensation { get; set; }

    public virtual ICollection<Project> Projects { get; set; }

    public virtual ICollection<Tag> Tags { get; set; } 

    public virtual ICollection<ChartVal> ChartVals { get; set; } 

}


public class ChartVal : PersistableObject
{
    [Required]
    [StringLength(40)]
    public string Key { get; set; }

    public double Value { get; set; }

    public string Percentage { get; set; }

    public int PositionId { get; set; }

    public virtual Position Position { get; set; }
}

感谢您抽出时间查看我的问题。感谢您的宝贵时间!

【问题讨论】:

    标签: knockout.js breeze single-page-application


    【解决方案1】:

    我也看到了。我相信解决方案将涉及检测属性是否为集合并对其进行迭代以逐个添加项目。我没有尝试这样做,因为我仍在尝试确定这样做是否正确

    我并不打算将其作为答案本身,而是表明其他人与发帖人遵循了相同的轨道,并且会对社区对此的任何回应感兴趣。

    【讨论】:

      【解决方案2】:

      我遇到了类似的问题,部分用户实体具有“imageUser”导航属性。

      我刚刚将 John Papa 的 mapDtosToEntities“mapToEntity”函数更改为此,它似乎正在工作 - 我对这一切都是新手,所以我不能保证与保存更改相关的导航属性的完整性,但它肯定是映射我创建了一个“imageUrl”计算属性的关联,该属性检索第一个关联并将其显示在图像元素中(即眼见为实):

              function mapToEntity(entity, dto) {
                  // entity is an object with observables
                  // dto is from json
                  for (var prop in dto) {
                      if (dto.hasOwnProperty(prop)) {
                          if (typeof(dto[prop]) != "object") {
                              entity[prop](dto[prop]);
                          } else {
                              entity[prop] = ko.observable(dto[prop]);
                          }
                      }
                  }
      
                  return entity;
              }
      

      【讨论】:

        【解决方案3】:

        最后,我放弃了 John Papa 的 mapDtosToEntities 映射器方法,只是循环了我的收藏...

        function querySucceeded(data) {
                        var list = [];
                        for(i = 0; i< data.results.length; i++)
                        {
                            list.push(data.results[i]);
                        }
                        observables(list);
                    }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多