如何动态地向实体添加属性?我一直在寻找,但没有找到任何东西。
例如,我有这个模型定义(我正在使用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},
});
在某些时候,我需要使用新属性扩展我的模型。最初我不知道这些属性的名称。
答案 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来管理数据模型中的更改。