如何动态地向实体添加属性?

时间:2013-08-22 12:49:01

标签: javascript web-sql jaydata

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

例如,我有这个模型定义(我正在使用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},
    });

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

1 个答案:

答案 0 :(得分:1)

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

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

$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

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