Javascript JayData:尝试以1对多的方式插入,得到默认错误回调
我已将应用程序和数据库上下文精简到最简单的部分。我有两张桌子,地图和记号笔。每个地图都有许多标记。对于现有地图,我似乎无法插入新标记;我得到了默认的错误回调 通过jaydata.js进行跟踪,我在SqLiteProvider.js文件的Javascript JayData:尝试以1对多的方式插入,得到默认错误回调,javascript,sqlite,jaydata,Javascript,Sqlite,Jaydata,我已将应用程序和数据库上下文精简到最简单的部分。我有两张桌子,地图和记号笔。每个地图都有许多标记。对于现有地图,我似乎无法插入新标记;我得到了默认的错误回调 通过jaydata.js进行跟踪,我在SqLiteProvider.js文件的exec函数中发现一个错误。这是一个SQL故障,正在尝试将映射(设置了主键)插入表中,但失败。我做错了什么 我的背景: $data.Entity.extend("$org.types.Marker", { Id: { type: "int", key: t
exec
函数中发现一个错误。这是一个SQL故障,正在尝试将映射(设置了主键)插入表中,但失败。我做错了什么
我的背景:
$data.Entity.extend("$org.types.Marker", {
Id: { type: "int", key: true, computed: true },
Left: { type: "int", required: true },
Top: { type: "int", required: true },
Color: { type: "string", required: true },
Name: { type: "string", required: true },
Map: { type: "$org.types.Map", inverseProperty: "Markers" }
});
$data.Entity.extend("$org.types.Map", {
Id: { type: "int", key: true, computed: true },
Title: { type: "string", required: true },
Src: { type: "string", required: true },
Height: { type: "int", required: true },
Width: { type: "int", required: true },
Markers: { type: "Array", elementType: "$org.types.Marker", inverseProperty: "Map" }
});
$data.EntityContext.extend("$org.types.OrgContext", {
Maps: { type: $data.EntitySet, elementType: $org.types.Map },
Markers: { type: $data.EntitySet, elementType: $org.types.Marker },
});
var DB = new $org.types.OrgContext({ name: "webSql", databaseName: "Testing"});
我的测试代码:
DB.Maps.single( function (map) { return map.Id == 1; }, {}, function(map) {
var marker = new $org.types.Marker({
Left: 250,
Top: 350,
Color: 'green',
Name: 'Example',
Map: map});
DB.Markers.add(marker);
DB.saveChanges(function() {
alert(marker.Id);
});
});
该示例不插入贴图对象。如果你已经有了,这不是问题 有一个被遗忘了很多次的一般性问题:在使用提供程序访问数据之前,应该使用
context.onReady()
这本身并不能解决问题,在保存ne标记对象之前,应该添加一行:
DB.Maps.attach(map);
这是将对象移动到上下文范围并将映射的entityState属性设置为$data.entityState.Unchanged所必需的。如果从数据库中读取实体,则entityState将是未知的,并且提供程序将尝试将其保存为新记录。试图将映射实体另存为新记录导致SQL错误,因为存在ID为1的现有记录
更新后的代码如下所示:
var DB = new $org.types.OrgContext({ name: "webSql", databaseName: "Testing" });
DB.onReady(function () {
DB.Maps.single(function (map) { return map.Id == 1; }, {}, function (map) {
DB.Maps.attach(map); //this sets map.entityState = $data.EntityState.Unchanged;
var marker = new $org.types.Marker({
Left: 250,
Top: 350,
Color: 'green',
Name: 'Example',
Map: map
});
DB.Markers.add(marker);
DB.saveChanges(function () {
alert(marker.Id)
});
});
});
更新:如果使用新地图实体保存新Maker,则无需附加,代码只需DB.onReady()谢谢;关键部分是
attach()
。同样感谢您对entityState属性的解释——这完全有道理。我想补充一点,文档对context.onReady()
-我已经浏览了几周的JayData文档,这是我第一次读到这方面的内容!谢谢你的反馈,我必须完全同意你的文件,我们开始在网站上对此进行改进。太棒了。我认为JayData是一个非常有用的ORM,我很喜欢使用它。@Robesz每个人都在为文档和使用JayData的几个例子而苦恼。这是一个强大的工具,但人们必须知道如何使用它。顺便说一句,请看我最近的问题。我需要一些关于jay数据的指导。。谢谢。@DontVodeMeDown:您可以在这里找到更多示例:。这是我第一次听到大家对医生的不满,请提出具体问题,团队会帮助你。