我是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
。
我在这里错过了什么吗?
答案 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等情况。
现在问题已经解决了。