从现有的微风中创建实体

多米尼克斯

我已经ing了几天头。

假设您有一个汽车销售管理应用程序。您出售不同的型号。您的汽车模型有50个属性。仅作为示例,假设您要出售布加迪威龙。现在,您刚刚收到了其中5辆车。因此,我登录到我的应用程序,首先创建具有特定ID的Bugatti Veyron。然后我想添加第二个,但是有一个问题-我将不得不再次写下所有这些属性!我想要一个“复制”按钮,我只想更改序列号,轻而易举的就可以更改ID和voila,那里有两辆车!

出于黑客的考虑,起初我创建了以下解决方案:

newCar(datacontext.createCar());
newCar().property1(oldCar().property1());
newCar().property2(oldCar().property2());
...

这很丑陋,在我证明自己可以做到之后,当然,要求申请的目的是使所有内容都可复制-绝不行!某处必须有副本。在挖掘了很多东西之后,甚至试图在微风中改变某些东西,我也无法做以下事情:

manager.createEntity('Car', oldCar);

现在,最新的解决方案比第一个解决方案更可行,但仍然需要比我想要的更多的代码,并且不够直观:

        var newObject = {};
        manager.metadataStore._structuralTypeMap[oldCar.entityType.name].dataProperties.forEach(function (singleProperty) {
                if (!singleProperty.isPartOfKey)
                newObject[singleProperty.name] = oldCar[singleProperty.name];
            });
        var newCar = manager.createEntity('Equipment', newObject);

是否有其他“更清洁”的方法来制作具有完全相同的属性,但ID不同的新实体?

我应该提到Car实体中有一些ICollections,但是这种有问题的解决方案忽略了可以改进的ICollections,但是目前,我自己通过一些.forEach循环来处理该问题。

病房

我们正在后台处理这种事情。准备就绪时,我们会通知您。没有承诺或时间安排。

同时,我对此付诸行动。我决定利用微风EntityManager.exportEntities方法知道如何克隆实体这一事实如果您阅读该方法的微妙源代码,就会知道它很棘手。

这是我想出的(作为平民,而不是Breeze开发人员):

function cloneItem(item) {
    // export w/o metadata and then parse the exported string.
    var exported = JSON.parse(manager.exportEntities([item], false));
    // extract the entity from the export
    var type = item.entityType;
    var copy = exported.entityGroupMap[type.name].entities[0];
    // remove the entityAspect
    delete copy.entityAspect; 
    // remove the key properties
    type.keyProperties.forEach(function (p) { delete copy[p.name]; });

    // the "copy" provides the initial values for the create
    return manager.createEntity(type, copy);
}

像您一样,它保留外键属性,这意味着父源的引用导航属性将具有从缓存中提取的值(如果源具有此值)。

像您一样,将不会填充集合导航属性。此方法不知道如何克隆子代。这也不是不言自明的。这对您来说是额外的功劳。

2013年12月15日更新

正如您所问的那样,我已经实现了克隆孩子(集合导航)的功能。我遵循了您建议的语法,因此用法如下:

cloneItem(something, ['collectionProp1', 'collectionProp2']); 

请注意,我再次依靠Breeze导出来完成繁重的工作

警告:此代码非常脆弱,并且不能推广到所有型号

function cloneItem(item, collectionNames) {
    var manager = item.entityAspect.entityManager;
    // export w/o metadata and then parse the exported string.
    var exported = JSON.parse(manager.exportEntities([item], false));
    // extract the entity from the export
    var type = item.entityType;
    var copy = exported.entityGroupMap[type.name].entities[0];
    // remove the entityAspect (todo: remove complexAspect from nested complex types)
    delete copy.entityAspect;
    // remove the key properties (assumes key is store-generated)
    type.keyProperties.forEach(function (p) { delete copy[p.name]; });

    // the "copy" provides the initial values for the create
    var newItem = manager.createEntity(type, copy);

    if (collectionNames && collectionNames.length) {
        // can only handle parent w/ single PK values
        var parentKeyValue = newItem.entityAspect.getKey().values[0];
        collectionNames.forEach(copyChildren);
    }
    return newItem;

    function copyChildren(navPropName) {
        // todo: add much more error handling
        var navProp = type.getNavigationProperty(navPropName);
        if (navProp.isScalar) return; // only copies collection navigations. Todo: should it throw?

        // This method only copies children (dependent entities), not a related parent
        // Child (dependent) navigations have inverse FK names, not FK names
        var fk = navProp.invForeignKeyNames[0]; // can only handle child w/ single FK value
        if (!fk) return; 

        // Breeze `getProperty` gets values for all model libraries, e.g. both KO and Angular
        var children = item.getProperty(navPropName);
        if (children.length === 0) return;

        // Copy all children
        var childType = navProp.entityType;
        children = JSON.parse(manager.exportEntities(children, false));
        var copies = children.entityGroupMap[childType.name].entities;

        copies.forEach(function(c) {
            delete c.entityAspect;
            // remove key properties (assumes keys are store generated)
            childType.keyProperties.forEach(function (p) { delete c[p.name]; }); 
            // set the FK parent of the copy to the new item's PK               
            c[fk] = parentKeyValue;
            // merely creating them will cause Breeze to add them to the parent
            manager.createEntity(childType, c);
        });
    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

微风创建复杂实体

来自分类Dev

在微风中添加主/子实体的正确方法?

来自分类Dev

如何在微风中对扩展的实体使用谓词

来自分类Dev

添加新实体不会链接到现有的相关实体,而是创建一个新实体

来自分类Dev

微风创建实体,在本地更新

来自分类Dev

如何“更新”现有的命名实体识别模型-而不是从头开始创建?

来自分类Dev

(Udacity + GAE)创建一个表单以编辑现有的NDB实体

来自分类Dev

如何“更新”现有的命名实体识别模型-而不是从头开始创建?

来自分类Dev

创建引用现有实体的实体

来自分类Dev

从现有的json创建动态json

来自分类Dev

从现有的python代码创建方法

来自分类Dev

从现有的 ndarrays 创建 numpy ndarrays

来自分类Dev

使用现有的嵌套实体保存新的断开连接的实体,而无需复制现有的实体

来自分类Dev

如何更新现有的断开连接的实体

来自分类Dev

在现有实体属性上创建索引

来自分类Dev

在微风中创建复杂类型的未绑定实例的正确方法是什么?

来自分类Dev

在 EntityType 字段中创建与现有实体关联的新实体

来自分类Dev

如何强制symfony实体经理识别现有的子实体?

来自分类Dev

为现有的异步代码创建C ++阻止功能

来自分类Dev

为现有的类创建接口吗?

来自分类Dev

如何从现有的远程分支创建本地分支?

来自分类Dev

Symfony2表单:创建新的或选择现有的

来自分类Dev

如何为现有的Maven项目创建EAR文件

来自分类Dev

从现有的两列python创建唯一的ID

来自分类Dev

如何从现有的protobuf文件创建Java pojo?

来自分类Dev

如何从现有的Numpy数组创建Numpy数组

来自分类Dev

从现有的VHD创建VM:预览门户

来自分类Dev

熊猫通过现有的df行创建单独的df

来自分类Dev

在现有的jhipster应用中创建子用户

Related 相关文章

  1. 1

    微风创建复杂实体

  2. 2

    在微风中添加主/子实体的正确方法?

  3. 3

    如何在微风中对扩展的实体使用谓词

  4. 4

    添加新实体不会链接到现有的相关实体,而是创建一个新实体

  5. 5

    微风创建实体,在本地更新

  6. 6

    如何“更新”现有的命名实体识别模型-而不是从头开始创建?

  7. 7

    (Udacity + GAE)创建一个表单以编辑现有的NDB实体

  8. 8

    如何“更新”现有的命名实体识别模型-而不是从头开始创建?

  9. 9

    创建引用现有实体的实体

  10. 10

    从现有的json创建动态json

  11. 11

    从现有的python代码创建方法

  12. 12

    从现有的 ndarrays 创建 numpy ndarrays

  13. 13

    使用现有的嵌套实体保存新的断开连接的实体,而无需复制现有的实体

  14. 14

    如何更新现有的断开连接的实体

  15. 15

    在现有实体属性上创建索引

  16. 16

    在微风中创建复杂类型的未绑定实例的正确方法是什么?

  17. 17

    在 EntityType 字段中创建与现有实体关联的新实体

  18. 18

    如何强制symfony实体经理识别现有的子实体?

  19. 19

    为现有的异步代码创建C ++阻止功能

  20. 20

    为现有的类创建接口吗?

  21. 21

    如何从现有的远程分支创建本地分支?

  22. 22

    Symfony2表单:创建新的或选择现有的

  23. 23

    如何为现有的Maven项目创建EAR文件

  24. 24

    从现有的两列python创建唯一的ID

  25. 25

    如何从现有的protobuf文件创建Java pojo?

  26. 26

    如何从现有的Numpy数组创建Numpy数组

  27. 27

    从现有的VHD创建VM:预览门户

  28. 28

    熊猫通过现有的df行创建单独的df

  29. 29

    在现有的jhipster应用中创建子用户

热门标签

归档