【问题标题】:Properties are not mapped, empty Entity, Breeze with NoDB/PHP/Doctrine属性未映射,实体为空,带有 NoDB/PHP/Doctrine 的 Breeze
【发布时间】:2014-06-12 18:02:23
【问题描述】:

我通过定义一个模型(目前只有一个实体/模型)来提供元数据:

function init(store){
        addSerieType(store);
    }

    function addSerieType(store){
        store.addEntityType({
            shortName: "Serie",
            namespace: "xxx",
            defaultResourceName: "Serien",
            //autoGeneratedKeyType: breeze.AutoGeneratedKeyType.Identity,
            dataProperties:{
                id: { dataType: breeze.DataType.Int32, isNullable: false, isPartOfKey: true },
                kat: { dataType: breeze.DataType.Int32, isNullable: false },
                bez: { dataType: breeze.DataType.String, maxLength: 64, isNullable: false, 
                    validators: [ breeze.Validator.required(), breeze.Validator.maxLength( {maxLength: 64})]     // Add client-side validation to 'title' 
                },
                jahr: { dataType: breeze.DataType.Int32, isNullable: false },
                grp: { dataType: breeze.DataType.Int32, isNullable: false },
                bem: { dataType: breeze.DataType.String, maxLength: 1024, isNullable: false, 
                    validators: [ breeze.Validator.maxLength( {maxLength: 1024})]     // Add client-side validation to 'title' 
                }
            }
        });

        store.setEntityTypeForResourceName("Serien", "Serie");
        store.registerEntityTypeCtor("Serie", null, serieInitializer);
    }

    function serieInitializer(serie){
        serie.errorMessage = ko.observable();
    }

    return{
        init: init
    }

从 PHP/Doctrine 返回的 JSON 包括列 $id="Serie.id"(例如 1,2,3 ...)和 $type="Serie"。所有列和属性名称均为小写,NamingConvention 设置为无。我得到一个空实体 - 具有提供的默认值。

对于一个测试,我创建了一个这样的新实体:

var s = manager.createEntity("Serie", { id: 42, bez: "Test1", jahr: 2999} );

这行得通,我在实体中获得 ko.observable 属性,并且实体被物化到缓存中。

为什么我没有从 JSON 结果中获取实体?我已经将服务器元数据设置为 false,提供了一个模型,一切都匹配,但是......实体是空的。完全没有错误。有什么提示吗?谢谢。

【问题讨论】:

    标签: javascript breeze


    【解决方案1】:

    您的查询是什么样的? Breeze 需要知道任何查询返回的 EntityType,这可以通过以下 any 来完成:

    • 通过在 元数据存储。这可以添加到使用 MetadataStore.setEntityTypeForResourceName 方法
    • 通过 toType() 调用 在您的 EntityQuery() 上
    • 通过任一内的规范 DataService 或 EntityQuery 的 JsonResultsAdapter。 “默认”JsonResultsAdapter 假定 JSON.NET 序列化,这不太可能适用于 PHP 后端,因此您可能希望为 PHP 创建一个自定义 JsonResultsAdapter 并将其添加到您的 DataService。

    Breeze 无法将您的查询结果映射到 Entity 类型的标准症状是结果没有变成“可观察的”。如果 Breeze 无法确定任何返回结果的 EntityType,它只会将它们保留为“本机”json 格式。

    【讨论】:

    • 我尝试了 toType 调用,返回的 JSON 包括 $id 和 $type 列 -> 就像 JSON.NET 结果一样。所以原始结果应该映射到实体。我也尝试过自定义 JsonResultsAdapter 但总是出现 entity-no-found 错误。 $id 和 $type 列应该可以解决问题 - 并且创建了 Serie 实体 - 但所有属性都是空的。您可以为自定义 JsonResultsAdapter 发布一些代码/链接吗?我已经尝试过 Breeze Samples 中的 Edmunds,但遇到了同样的问题。谢谢。
    • 尝试使用 $type 列中的名称调用 MetadataStore.getEntityType 方法。我的猜测是它将返回“未定义”。如果是这样,那么您还可以调用 MetadataStore.getEntityTypes 方法来查看您定义的所有实体和复杂类型。我猜你有命名问题。
    • 好的,没错。没有定义 EntityType。所以我的模型/元数据中的某些东西一定是错误的。谢谢。
    • 好的,我已经解决了。 getEntityType() / getEntityTypes() 调用返回正确的实体 - 属性仍然是空的,但是 ko.observables。
    • 现在一切正常 - 我从头开始,就像这两个答案中描述的那样。再次感谢你们。
    【解决方案2】:

    请查看this similar StackOverflow question 我将引导您完成诊断。提出这个问题的人也在使用 PHP 服务器。

    【讨论】:

    • 太好了,这正是我的问题。我只是不明白为什么原始 json 没有映射到 Entity 但管理器中的 createEntity 工作正常。为了测试,我将所有代码都放在了我的数据上下文中。你有没有看到我的模型中缺少任何东西?谢谢。
    【解决方案3】:

    (这可能对任何人都有帮助)

    如果你正在使用 Doctrine 2 (PHP) 和微风 js,你可以试试这个库:https://github.com/adrotec/breeze.server.php

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-03
      • 1970-01-01
      • 2012-04-22
      • 2019-08-27
      • 2012-12-17
      • 2012-12-18
      • 1970-01-01
      相关资源
      最近更新 更多