BreezeJs - 具有继承元数据的复杂类型的数组

时间:2014-09-09 16:05:23

标签: c# angularjs mongodb breeze

我正在使用BreezeJs与AngularJs通过MongoDB后端与Web API进行通信,并且无法为需要具有继承的复杂类型数组的文档之一定义元数据。

这是MongoDB文档

{
  "_id" : ObjectId("53f2f0f117166f1e6898cc32"),
  "Name" : "SectionContainer1",
  "Sections" : [{
     "_t" : "SectionA",
     "Title" : "sdf sdaf dsfsdfdsfsdfds"
  }, {
     "_t" : "SectionB",
     "Title" : "sdf sdaf dsfsdfdsfsdfds"
  }, {
     "_t" : "SectionC",
     "_id" : "53f38e1317166f196025849b",
     "Title" : "sdf sdaf dsfsdfdsfsdfds"
  }]
}

和类结构

public class SectionContainer
{
   public ObjectId Id{get;set;}
   public string Name{get;set;}
   public List<BaseSection> Sections{get;set;}
}

public class BaseSection
{
   public string Title{get;set;}
}

public class SectionA : BaseSection
{
   ...
}

public class SectionB : BaseSection
{
   ...
}

public class SectionC : BaseSection
{
   ...
}

这就是我想在BreezeJs中做的事情

(function () {
'use strict';

angular
    .module('app')
    .factory('metadataFactory', ['breeze', metadataFactory]);

function metadataFactory(breeze) {
    var addType, DATE, DT, helper, ID;

    // The metadata definition service
    return {
        fillMetadataStore: fillMetadataStore
    };

    /*** Implementation ***/
    function fillMetadataStore(metadataStore, serviceName) {
        init(metadataStore, serviceName);

        addTypes();
    }

    function addTypes() {
        addType({
            name: 'SectionContainer',
            dataProperties: {
                id: { isPartOfKey: true },
                name: { nullOk: true },
                sections: { complexTypeName: "BaseSection", hasMany: true }
            }
        });

        addType({
            name: 'BaseSection',
            isAbstract: true,
            isComplexType: true,
            dataProperties: {
                id: { isPartOfKey: true },
                title: { nullOk: true }
            }
        });

        addType({
            name: 'SectionA',
            isComplexType: true,
            baseTypeName: "BaseSection",
            dataProperties: {
                id: { isPartOfKey: true },
                title: { nullOk: true },
            }
        });

        addType({
            name: 'SectionB',
            isComplexType: true,
            baseTypeName: "BaseSection",
            dataProperties: {
                id: { isPartOfKey: true },
                title: { nullOk: true },
            }
        });

        addType({
            name: 'SectionC',
            isComplexType: true,
            baseTypeName: "BaseSection",
            dataProperties: {
                id: { isPartOfKey: true },
                title: { nullOk: true },
            }
        });
    }

    // Initialize the metdataFactory with convenience fns and variables 
    function init(metadataStore, serviceName) {

        var store = metadataStore; // the metadataStore that we'll be filling

        // 'Identity' is the default key generation strategy for this app
        var keyGen = breeze.AutoGeneratedKeyType.Identity;

        // Breeze Labs: breeze.metadata.helper.js
        // https://github.com/IdeaBlade/Breeze/blob/master/Breeze.Client/Scripts/Labs/breeze.metadata-helper.js
        // The helper reduces data entry by applying common conventions
        // and converting common abbreviations (e.g., 'type' -> 'dataType')
        helper = new breeze.config.MetadataHelper(namespace, keyGen);
        helper.addDataService(store, serviceName);

        // addType - make it easy to add the type to the store using the helper
        addType = function (type) { return helper.addTypeToStore(store, type); };

        // DataTypes we'll be using
        DT = breeze.DataType;
        DATE = DT.DateTime;
        ID = DT.Int32;
    }
  }
})();

不幸的是,Breeze似乎不允许在复杂类型中继承,并且由于在MongoDB中格式化数据的方式,这些部分不是它们自己的实体。是否有可能在Breeze中表示这样的数据,如果是这样的话?

1 个答案:

答案 0 :(得分:0)

取自Breeze.js文档 -

  

复杂类型没有标识(微风中的关键属性),因此不能独立存在。复杂类型只能作为实体类型或其他复杂类型的属性存在。

所以要回答你的问题,没有父母就不能存在。此外,您无法在复杂类型上设置密钥,因为它无效。这是复杂类型的本质,不仅在Breeze中,而且在我熟悉的类似系统中。

我开始为你写一个答案,但是在回顾你的问题之后,我发现了一些不起作用的问题,而且我不确定你是否知道我没有做过什么&#39 ;所以我想我会指出明显是否有帮助 -

addType({
    name: 'BaseSection',
    // I don't believe this is a valid property
    isAbstract: true,
    isComplexType: true,
    dataProperties: {
        // Complex types cannot have keys
        id: { isPartOfKey: true },
        title: { nullOk: true }
    }
});

我相信你已经知道了,所以你使用的代码似乎是伪代码。如果是这种情况,那么我只会提出两条建议 -

  1. 在模型定义中定义服务器上的实体,使其已经继承了所需的内容,并且在客户端上仍然可以使用未使用的属性,但在返回之前将为null。

  2. 使用Breeze实体而不是尝试使用复杂类型。当你说你不能拥有关键属性时,你所尝试使用的模型似乎是正确的方向,但这是除了标题之外的唯一属性。您可以随时返回父对象并重新使用Id,只要它们位于不同的集合中,这样就有效了 -

    的addType({     名称:&#39; BaseSection&#39;,     dataProperties:{         id:{type:ID},         title:{nullOk:true}     } });

    的addType({     名称:&#39; SectionA&#39;,     dataProperties:{         id:{type:ID},         title:{nullOk:true}     },     navigationProperties:{         baseSection:&#39; BaseSection&#39;     } });

  3. 这里的问题是你需要让Breeze知道SectionA上的属性id应该与BaseSection匹配,这很容易做到但是考虑到你使用的这种速记元数据格式我不熟悉如何做到这一点。从长远来看,该属性看起来像这样 -

    "navigationProperties": [
        {
            "name": "baseSection",
            "entityTypeName": "BaseSection",
            "isScalar": true,
            "associationName": "SectionA_BaseSection"
        },
    ]