【问题标题】:BreezeJS create complex enityBreezeJS 创建复杂实体
【发布时间】:2014-09-23 05:36:34
【问题描述】:

我正在使用 ServiceStack 向客户端获取 JSON 数据。我已经为 BreezeJS 设置了映射 ServiceStack 调用。 Web服务返回的数据格式如下:

Meta: {Path:[{"Name":"Root","Id":"00000000000000000000000000000000"}], Duration:145}
  Duration: "145"
  Path: "[{"Name":"Root","Id":"00000000000000000000000000000000"}]"
Offset: 0
Results: [,…]
  0: {Description:SLO, InternalKey:SLO, IsActive:true, Name:SLO, ParentId:00000000000000000000000000000000,…}
    ChildCount: 2
    CreatedById: "ed85f2b9c0bf46729cbb17cee25e3287"
    CreatedDate: "2014-09-06T06:23:16.6000000"
    Description: "SLO"
    HasChildren: true
    Id: "9b636028e3f04535a5147a2df375adaa"
    InstanceType: "Container"
    InternalKey: "SLO"
    IsActive: true
    ModifiedDate: "2014-09-17T11:04:23.1553432"
    Name: "SLO"
    ParentId: "00000000000000000000000000000000"
Total: 1

如果我为节点“结果”手动创建实体,数据将被映射,我可以在视图中读取它。 实体定义:

define(function (require) {
    var breeze = require('breeze');

    var ctor = function () {
        var self = this;
        self.DT = breeze.DataType;
    };

    ctor.prototype.instanceCreate = function (nameSpace) {
        var self = this;
        return self.instance = {
            shortName: "instances",
            namespace: nameSpace,
            autoGeneratedKeyType: breeze.AutoGeneratedKeyType.Identity,
            defaultResourceName: "instances",

            dataProperties: {
                ConnectionString: { dataType: self.String },
                Description: { dataType: self.String },
                InternalKey: { dataType: self.String },
                IsActive: { dataType: self.Boolean },
                Name: { dataType: self.String },
                ParentId: { dataType: self.Int32 },
                InstanceType: { dataType: self.String },
                ChildCount: { dataType: self.Int32 },
                HasChildren: { dataType: self.Boolean },
                Uid: { dataType: self.Guid },
                ETag: { dataType: self.String },
                Id: { dataType: self.Int32, isPartOfKey: true },
                CreatedDate: { dataType: self.DateTime },
                CreatedById: { dataType: self.String },
                ModifiedDate: { dataType: self.DateTime },
                ModifiedById: { dataType: self.String },
                DeletedDate: { dataType: self.DateTime },
                DeletedById: { dataType: self.Int32 },
            }
        };
    };

    return new ctor();
});

问题是:是否可以在 Breeze 中定义实体,以便我可以将 JSON 中的“结果”节点和“元”读取到单个实体定义中。所以我可以访问类似的数据: 数据.结果和数据.元?或者有没有其他方法可以解决这个问题。

【问题讨论】:

    标签: entity breeze


    【解决方案1】:

    我不确定我是否完全理解您的问题。我认为您在问是否有一种方法可以通过展平一些数据并从不同节点中挑选来将 JSON 映射到实体中。

    如果是这样,答案是……绝对的。您需要创建一个自定义的JsonResultsAdapter,并且可能还有一个自定义的DataServiceAdapter(它有自己的JsonResultsAdapter,用于处理服务器对保存(例如新实例)的响应)。

    您可以在微风.js 本身和各种微风实验室中找到这两种适配器的示例。

    我希望我可以为您指出编写这些适配器的文档和指南。它在我们的积压工作中。

    FWIW,我不会在实体属性中找到诸如etag 之类的持久性元数据。那是您需要在幕后才能使持久性工作的元数据;它不是“业务数据”,也不是应用程序开发人员应该看到或关心的东西。这就是为什么在我们的 OData 和 SharePoint DataService 适配器中,我们将这种东西移动到节点的 result.extraMetadata 属性中。 Breeze 将其拾取并将其移动到entityAspect,这是保存持久性信息(例如,更改状态)的地方。 Breeze 将 entityAspect.extraMetadata 识别为一个属性包,您可以在其中添加任何可以 JSON.stringify 的内容。

    【讨论】:

    • 感谢您的回答,我们会尽力落实您的建议。发现,我在 querySucceeded 函数中的数据包含来自 JSON 的所有数据,它在“data.httpResponse.data.Meta”中。问题是当我运行“manager.executeQueryLocally(query)”时,我只得到我的实例实体数据。有没有一种方法可以像从 Web 服务运行查询一样从缓存中获取所有内容?
    • 如您所见,Breeze 在data 对象中为您提供整个httpResponse。该响应的哪一部分进入您的缓存实体由您的 JsonResultsAdapter (JRA) 控制。我们无法使用开箱即用的 JRA 预测所有可能的 JSON 格式。但是它们很容易编写;试一试;-)
    猜你喜欢
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多