0

我正在使用热毛巾模板并通过使用微风扩展它的功能。我使用了轻风.partial-entities.js 文件将轻风实体转换为适当的 dto,可以被淘汰的 observables 使用,如下所示。

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;
        }

对于少数实体,它可以正常工作并将微风数据转换为实体,但对于其中一个实体实现失败。相同的模型如下所示。

public class StandardResourceProperty
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public int StandardResourceId{ get; set; }
    public int InputTypeId{ get; set; }
    public int ListGroupId{ get; set; }
    public string Format{ get; set; }
    public string Calculation{ get; set; }
    public bool Required{ get; set; }
    public int MinSize{ get; set; }
    public int MaxSize{ get; set; }
    public string DefaultValue{ get; set; }
    public string Comment { get; set; }

    public virtual StandardResource AssociatedStandardResource { get; set; }
    public virtual List AssociatedList { get; set; }
}

我得到的错误是 TypeError: this[propertyName] is not a function [Break On This Error]

此属性名称;

微风.debug.js(第 13157 行)

]

带代码

proto.setProperty = function(propertyName, value) {
        this[propertyName](value);
        // allow set property chaining.
        return this;
    };

请告诉我 。实现也可能出现什么问题,如果我能就如何调试和跟踪此类问题获得更多建议,那就太好了。

4

1 回答 1

2

让我们备份。我不明白您所说的“将微风实体转换为可供淘汰可观察对象使用的适当 dto ”是什么意思。Breeze 实体已经配置为 KO observables(假设您使用的是默认的 Breeze 模型库配置)。你想做什么?

我怀疑您正在关注 Code Camper Jumpstart 课程,它会在其中进行getSessionPartials投影查询。该查询(像所有投影一样)返回 DTO - 而不是实体 - 并将它们与dtoToEntityMapper方法映射到Session实体中。

CCJSdtoToEntityMapper方法不能与实体一起使用。它用于从 DTO 转换为实体,并将 DTO(而非实体)作为输入。

再见 dtoEntityMapper

dtoToEntityMapper方法早于 Breeze 通过添加.toType('StandardResourceProperty')到投影查询来自动化投影到实体映射的能力。

下面是 CCJSgetSessionPartials查询现在的样子:

var 查询 = 实体查询
    .from('会话')
    .select('id, title, code, speakerId, trackId, timeSlotId, roomId, level, tags')
    .orderBy(orderBy.session)
    .toType('会话');

如果你这样做,请务必在自定义构造函数中将isPartial标志的默认状态设置为true(参见model.js

metadataStore.registerEntityTypeCtor(
    '会话',函数(){ this.isPartial = true; }, sessionInitializer);

请注意,这this.isPartial = true与默认为false的 CCJS 示例相反

确保isPartial(false)在查询或创建完整实体时进行设置。在 CCJS 中有两个地方可以做到这一点:在getSessionByIdAND的成功回调中,createSession其中将变为:

var createSession = 函数 () {
    返回 manager.createEntity(entityNames.session, {isPartial: false});
};
于 2013-05-31T19:00:21.833 回答