0

如何动态地向实体添加属性?我一直在寻找,但没有找到任何东西。

例如,我有这个模型定义(我正在使用 WebSQL 提供程序):

$data.Entity.extend('$db.Types.Person', {
        id: { type: 'int', key: true, computed: true },
        name: { type: 'string' }
    });

$data.EntityContext.extend('$db.Types.DBContext', {
        Persons: { type: $data.EntitySet, elementType: $db.Types.Person},
    });

在某些时候,我需要使用新属性扩展我的模型。最初我不知道这些属性的名称。

4

1 回答 1

1

语法非常简单,但背景信息更重要,请在重用代码段之前阅读整个答案。

YourType 可以使用该YourType.addMember()函数使用新字段进行扩展。请参阅此示例片段:

$data.Entity.extend('Product', {
  id: { type: 'int', key: true, computed: true },
  Name: { type: 'string' }
});

$data.EntityContext.extend('Northwind', {
  Products: { type: $data.EntitySet, elementType: Product},
});

Product.addMember('Description', {
    type:'string', 
    key: false, 
    computed: false, 
    required: false
});

var context = new Northwind({provider: 'webSql', databaseName: 'Northwind'});

context.onReady(function() {
    var product1 = new Product({ Name: 'Beer', Description: 'tasty'});
    context.Products.add(product1);
    context.saveChanges(function(result) {
        //check the content of WebSQL DB
        console.log(product1);
    });
});

您可以addMember()在创建上下文实例之前使用唯一的。

重要信息: 库中没有数据迁移/合并,webSql 模式修改的默认行为是删除并重新创建数据库。由于 IndexedDB 未绑定到模式,因此不会删除现有记录。通过运行此代码并添加更多字段来尝试一下,这是一个有效的JSFiddle

真正的解决方案是使用JayData Pro的Schema Evolution 模块来管理数据模型中的更改。

于 2013-08-23T15:16:46.087 回答