微风& OData:麻烦扩大收藏

时间:2013-05-15 20:19:57

标签: odata breeze jaydata

什么有效:

在Breeze中,我可以执行此查询:

Q1

breeze.EntityQuery.from('accounts').where('id', 'eq', account_id)

导致此请求:

R1

http://localhost:8000/odata/findash.svc/accounts
    ?$filter=id eq 'NTE5M2UxMzQzMmY3MDAxYzE1MDAwMDAx'

返回正确的数据,但transactions属性如下所示:

transactions: {
    __deferred: {
        uri: "http://localhost:8000/odata/findash.svc/accounts('NTE5M2UxMzQzMmY3MDAxYzE1MDAwMDAx')/transactions"
    }
}

我尝试在浏览器

中处理事务.__ deferred.uri中的URI

R1.1

http://localhost:8000/odata/findash.svc/
    accounts('NTE5M2UxMzQzMmY3MDAxYzE1MDAwMDAx')/transactions

它确实回应了我期望的交易。

什么行不通:

为了尝试通过Breeze获取该事务列表,我使用expand子句改变了上面的查询,如下所示:

Q2

breeze.EntityQuery.from('accounts')
    .where('id', 'eq', account_id).expand('transactions')

导致此请求:

R2

http://localhost:8000/odata/findash.svc/accounts
    ?$filter=id eq 'NTE5M2UxMzQzMmY3MDAxYzE1MDAwMDAx'&$expand=transactions

生成500错误。

我也试过这个Breeze查询:

Q3

breeze.EntityQuery.from('transactions')
    .expand('account').where('account.id', 'eq', account_id)

也会产生500错误。

我需要知道的是:

在我深入研究基于Node + MongoDB + JayData的OData服务之前,我试图排除Breeze。

上面R1和R2之间的唯一区别是添加了&$expand=transactions。 R1工作,R2导致500错误。如果R2是有效的OData请求,那么我需要将我的故障排除工作集中在我的JayData实现上。对我来说麻烦的是我是Breeze,OData&的新手。 JayData,所以我在缩小搜索范围时遇到了麻烦。

作为参考,我的JayData context.js在这里:

$data.Class.define("$findash.Types.Account", $data.Entity, null, {
    id: { type: "id", key: true, computed: true },
    name: { type: "string" },
    status: { type: "string" },
    notes: { type: "string" },
    transactions: { type: "Array", elementType: "$findash.Types.Transaction", inverseProperty: "account" }
}, null);
$data.Class.define("$findash.Types.Transaction", $data.Entity, null, {
    id: { type: "id", key: true, computed: true },
    account: { type: "$findash.Types.Account", inverseProperty: "transactions" },
    payee: { type: "string" },
    memo: { type: "string" },
    amount: { type: "int" }
}, null);
$data.Class.define("$findash.Types.FinanceContext", $data.EntityContext, null, {
    accounts: { type: $data.EntitySet, elementType: $findash.Types.Account },
    transactions: { type: $data.EntitySet, elementType: $findash.Types.Transaction }
}, null);
$findash.Types.FinanceContext.generateTestData = function (context, callBack) {
    context.accounts.add(new $findash.Types.Account({
        name: 'Checking',
        status: 'Active',
        notes: '<p>Notes lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus mauris quam, elementum in tincidunt id, mollis eget urna. Nulla fermentum est id risus venenatis malesuada. Quisque sed ipsum at nisl malesuada dictum vitae nec libero.</p><p>Aenean consectetur, purus eu semper feugiat, purus lacus semper nibh, at luctus ipsum metus non justo. Donec justo mi, rutrum a scelerisque sed, feugiat vel quam. Etiam justo nisi, vehicula ac congue vitae, ultricies non quam. Aliquam a velit in mauris luctus elementum. Praesent sollicitudin quam mattis velit sodales vitae feugiat felis volutpat.</p>',
        transactions: [
            new $findash.Types.Transaction({
                payee: 'Shell Gas',
                memo: 'Checkcard Transaction',
                amount: -3500
            }),
            new $findash.Types.Transaction({
                payee: 'Kroger',
                memo: 'Checkcard Transaction',
                amount: -9000
            }),
            new $findash.Types.Transaction({
                payee: 'Papa Murphy\'s',
                memo: 'Checkcard Transaction',
                amount: -1500
            })
        ]
    }));
    context.accounts.add(new $findash.Types.Account({
        name: 'Savings'
    }));
    context.accounts.add(new $findash.Types.Account({
        name: 'Power Company'
    }));
    context.accounts.add(new $findash.Types.Account({
        name: 'Gas Company'
    }));
    context.accounts.add(new $findash.Types.Account({
        name: 'Cable Company'
    }));
    context.accounts.add(new $findash.Types.Account({
        name: 'Water Company'
    }));
    context.accounts.add(new $findash.Types.Account({
        name: 'Trash Service'
    }));
    context.saveChanges(function (count) {
        if (callBack) {
            callBack(count);
        }
    });
};
module.exports = exports = $findash.Types.FinanceContext;

1 个答案:

答案 0 :(得分:0)

您可以发布服务器端模型相关部分的代码吗?这看起来像是服务器端的模型定义问题,或者它是如何通过OData公开的。

对此的真正考验是尝试在没有Breeze参与的情况下点击OData服务。我猜你会得到同样的错误。如果没有,那么这是一个微风错误。如果是这样,那么您需要查看您的OData服务。