jaydata:如何正确“加载”实体进行编辑?

时间:2013-10-31 19:42:21

标签: javascript jaydata

此代码应该在浏览器中运行。

<!DOCTYPE html>
<html>
    <head>
        <title>JayData testing</title>

        <script type="text/javascript" src="jquery-1.9.1.js"></script>
        <script type="text/javascript" src="jaydata.js"></script>
        <script type="text/javascript" src="SqLiteProvider.js"></script>

        <script type="text/javascript">

            $data.Entity.extend('$data.Types.ReferencedEntity', {
                Oid: {type: $data.Integer, key: true, computed: true},
                Codigo: {type: $data.String},
                Nombre: {type: $data.String},
                MainsByOne: {type: $data.Array, elementType: '$data.Types.MainEntity', inverseProperty: 'ReferenceOne'},
                MainsByTwo: {type: $data.Array, elementType: '$data.Types.MainEntity', inverseProperty: 'ReferenceTwo'}
            });

            $data.Entity.extend('$data.Types.MainEntity', {
                Oid: {type: $data.Integer, key: true, computed: true},
                Codigo: {type: $data.String},
                ReferenceOne: {type: '$data.Types.ReferencedEntity', inverseProperty: 'MainsByOne'},
                ReferenceTwo: {type: '$data.Types.ReferencedEntity', inverseProperty: 'MainsByTwo'}
            });

            $data.EntityContext.extend('$data.Types.LocalDBContext', {
                ReferencedEntities: {type: $data.EntitySet, elementType: $data.Types.ReferencedEntity},
                MainEntities: {type: $data.EntitySet, elementType: $data.Types.MainEntity}
            });

            window.app = {};

            app.localdb = new $data.Types.LocalDBContext({
                name: 'webSql',
                databaseName: 'Test',
                version: "1.0",
                maxSize: 5 * 1024 * 1024,
                dbCreation: $data.storageProviders.DbCreationType.DropTableIfChanged
            });

            app.localdb.onReady(function() {
                console.log("smarterpjs.localdb.onReady!");
            });

            app.run = function() {
                /* Create the entities */
                var a = new $data.Types.ReferencedEntity();
                app.localdb.ReferencedEntities.add(a);
                a.Codigo = 'UNI';
                a.Nombre = 'UNIDAD';

                var m = new $data.Types.MainEntity();
                app.localdb.MainEntities.add(m);
                m.Codigo = 'MAIN';
                m.ReferenceOne = a;
                m.ReferenceTwo = a;

                app.localdb.saveChanges();

                /* Now query for editing... */

                var query = app.localdb.MainEntities
                        .include('ReferenceOne')
                        .include('ReferenceTwo')
                        .filter(function(m) {
                            return m.Codigo === 'MAIN';
                        }, undefined)
                        .first();

                query.then(function(result) {
                    /* As i need to 'edit' the result
                     * then i must attach the MainEntity itself,
                     * and the referenced objects ReferenceOne, and ReferenceTwo
                     */
                    app.localdb.attach(result);
                    app.localdb.attach(result.ReferenceOne);

                    /* The problem comes here, 
                     * as the entity Codigo 'MAIN' references on both fields 'ReferenceOne' and 'ReferenceTwo'
                     * the same 'ReferencedEntity'
                     */
                    app.localdb.attach(result.ReferenceTwo);
                });
            }

        </script>
    </head>
    <body>
        <div onclick="app.run()">CLICK ME!</div>
    </body>
</html>

拥有jaydata的测试应用程序,我的问题嵌入在相同的代码中。 但我要解释更多:我有一个MainEntity表,其中2个字段指向另一个ReferencedEntity表。例如:

ReferencedEntities = [ { Codigo: 'UNI' } ]
MainEntities = [ { 
 Codigo: 'MAIN', 
 ReferenceOne: { Codigo: 'UNI' } , 
 ReferenceTwo: { Codigo: 'UNI' }
}

使用这个非常简单的数据,当我尝试只加载一个MainEntity以使其完全可用时,用户可以编辑他们的任何字段,我得到以下错误:

**Context already contains this entity!!!** 

希望我明白我的意思,并且代码运行显示当前jaydata的v1.3.2的问题。

修改

我找到了“通过简单代码获取带有引用的完全加载对象的方法”。

更改在query.then()上,如下所示:

query.then(function(result) {
  app.localdb.attach(result);
  result.ReferenceOne = app.localdb.attachOrGet(result.ReferenceOne);
  result.ReferenceTwo = app.localdb.attachOrGet(result.ReferenceTwo);
});

那样:

  • 我总是使用attachOrGet加载每个引用的实体,以防它已经在上下文中
  • 我将每个返回的对象分配给原始对象,因此最终的“结果”作为编辑该实例,保存和保存更改的所有内容

希望有人觉得这很有用!

1 个答案:

答案 0 :(得分:0)

我认为它不会起作用。您可以在附加第二个孩子时尝试使用attachOrGet ..