BreezeJS创建复杂的实体

时间:2014-09-22 11:43:45

标签: entity breeze

我正在使用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

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

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读入单个实体定义。所以我可以访问以下数据: data.results和data.Meta?或者有没有其他方法来解决这个问题。

1 个答案:

答案 0 :(得分:0)

我不确定我完全理解你的问题。我认为你问是否有办法将JSON映射到一个实体,通过展平一些数据和从不同节点挑选。

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

您可以在breeze.js本身和各种Breeze Labs中找到两个适配器的示例。

我希望我能为您指出文档和编写这些适配器的指南。这是我们的积压工作。

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