breezejs addEntityType问题

时间:2013-07-22 13:32:54

标签: asp.net-mvc-4 asp.net-web-api breeze

我是breezejs的新手。我试图在客户端中定义我的实体类型,而不从服务器获取元数据。我在服务器实体中有一个名为ID的属性。

我使用以下代码将客户端的命名约定默认为camel case。

breeze.NamingConvention.camelCase.setAsDefault();

所以,我开始按如下方式映射实体

store.addEntityType({
        shortName: "Photo",
        namespace: "MyProj.Models",
        dataProperties: {
            id: {
                dataType: DataType.Guid,
                isNullable: false,
                isPartOfKey: true
            },
            title: {
                dataType: DataType.String
            },
            description: {
                dataType: DataType.String
            },
            createdDate: {
                dataType: DataType.DateTime
            },
        }
    });

除了id字段没有得到正确的值之外,这一切都很好。相反,它具有由breeze数据类型ctor设置的默认值,该值等于Guid.Empty

通过单步执行breezejs调试脚本,我发现它在来自ajax请求的数据中查找名为Id的属性名称。但由于属性为ID,因此无法找到它,因此将其初始化为empty guid字符串。我假设通过设置nameOnServer dataProperty的{​​{1}}属性,我将能够修复它。

id

但它不起作用。

进一步挖掘breez.debug.js代码,在第7154行的方法store.addEntityType({ shortName: "Photo", namespace: "MyProj.Models", dataProperties: { id: { dataType: DataType.Guid, isNullable: false, nameOnServer: 'ID', isPartOfKey: true }, title: { dataType: DataType.String }, description: { dataType: DataType.String }, createdDate: { dataType: DataType.DateTime }, } }); 中,它似乎忽略了我定义的updateClientServerNames

我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:1)

好的,感觉我通过微风文档度过了我的一生。无论如何,最后解决了这个问题。说实话,这不是一个微风中的问题(但我想知道为什么当我提供一个时它不会覆盖实际的nameOnServer)。这是一位开发人员在数据库实施的早期阶段(可能是6年前)发生的错误。如果数据库遵循Pascal Case命名约定,那么事情就会完美无缺。

作为一个解决方案,我编写了一个自定义命名约定,当命名约定为ID并将其与camelCase命名约定相结合时,它会更正命名约定错误。

var createInconsistenIDConvention = function () {
var serverPropertyNameToClient = function (serverPropertyName, prop) {

    if (prop && prop.isDataProperty && (prop.nameOnServer && prop.nameOnServer === "ID")) {
        return "id";
    } else {
        var firstSection = serverPropertyName.substr(0, 1).toLowerCase();
        var idSection = "";
        if (serverPropertyName.substr(1).indexOf("ID") != -1) {
            firstSection += serverPropertyName.substr(1, serverPropertyName.substr(1).indexOf("ID")).toLowerCase() + "Id";
        } else {
            firstSection += serverPropertyName.substr(1);
        }

        return firstSection;
    }
}
var clientPropertyNameToServer = function (clientPropertyName, prop) {
    if (prop && prop.isDataProperty && (prop.nameOnServer && prop.nameOnServer.indexOf("ID") != -1)) {
        return prop.nameOnServer;
    } else {
        return clientPropertyName.substr(0, 1).toUpperCase() + clientPropertyName.substr(1);
    }
}
return new breeze.NamingConvention({
    name: "inconsistenID",
    serverPropertyNameToClient: serverPropertyNameToClient,
    clientPropertyNameToServer: clientPropertyNameToServer
});
};

不确定我使用nameOnServer属性的方式是否正确。我在breeze网站上找不到任何相关文档。

请注意,上述代码仅考虑ID,CountryID,GameID,PersonID等情况。

现在问题已经解决了。