Asp.net mvc 4 breezejs附加类型问题
我是breezejs的新手。我试图在客户端定义我的实体类型,而不从服务器获取元数据。我在服务器实体中有一个名为ID的属性 我已使用以下代码将客户端中的命名约定默认为camel大小写Asp.net mvc 4 breezejs附加类型问题,asp.net-mvc-4,asp.net-web-api,breeze,Asp.net Mvc 4,Asp.net Web Api,Breeze,我是breezejs的新手。我试图在客户端定义我的实体类型,而不从服务器获取元数据。我在服务器实体中有一个名为ID的属性 我已使用以下代码将客户端中的命名约定默认为camel大小写 breeze.NamingConvention.camelCase.setAsDefault(); 因此,我开始映射实体,如下所示 store.addEntityType({ shortName: "Photo", namespace: "MyProj.Models",
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
,所以它将其初始化为空guid
字符串。我假设通过设置dataProperty
id
的nameOnServer
属性,我将能够修复它
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
},
}
});
但它不起作用
进一步挖掘breez.debug.js代码,在第7154行的方法updateClientServerNames
中,它似乎忽略了我定义的nameOnServer
我错过了什么吗?好吧,我觉得我的整个生命都在微风中度过。总之,问题终于解决了。老实说,这在breeze中不是一个问题(但我想知道,当我提供一个时,为什么它不覆盖实际的
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、GAMID、人物ID等情况:
现在问题解决了。好吧,感觉我的整个生命都在微风文档中度过。总之,问题终于解决了。老实说,这在breeze中不是一个问题(但我想知道,当我提供一个时,为什么它不覆盖实际的
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、GAMID、人物ID等情况:
问题暂时解决。我注释掉了
breeze.NamingConvention.camelCase.setAsDefault()代码>行,并相应地更改了映射详细信息(即,将它们更改为PascalCase
。这样可以很好地工作。但我希望它能够在javaScript标准camelCase
上工作。非常感谢您的帮助。我注释掉了breeze.NamingConvention.camelCase.setAsDefault();
行,并相应地更改了映射详细信息(也就是说,将它们更改为PascalCase
。这样做很好。但我希望它能在javaScript标准camelCase
上工作。非常感谢您的帮助。阿米拉,感谢您的评论。我们确实需要更好地记录元数据。即nameOnServer vs name和相关规则。尝试获取一些这方面的信息。)在接下来的几天内,我们将在网站上发布文档,但我们还有很多要补充的内容。:)嗨,杰伊。如果一个人遵循教程,这会有助于理解一些事情,而且,如果我遇到错误,我会在chrome控制台中调试几个小时。这样做有助于我理解大部分内容。事实上,我没有使用上述命名约定,因为我发现从长远来看,在edmx文件中更改它很容易。现在我正在尝试了解如何分配查找(国家/地区列表)当用户点击编辑时动态生成的下拉列表。我认为这是一个淘汰问题,而不是一个breezejs。感谢您提供此解决方案。它忽略了nameOnServer属性,这让我抓狂。我只是希望一切,客户端和服务器,都是camelCase!Amila,感谢您的评论。我们确实需要做得更好记录元数据的作业。例如,nameOnServer vs name和相关规则。试图在未来几天内将部分文档发布到网站上,但我们仍有很多要添加的内容。:)嗨,杰伊。如果一个人遵循教程,这会有助于理解一些事情,而且,如果我遇到错误,我会在chrome控制台中调试几个小时。这样做有助于我理解大部分内容。事实上,我没有使用上述命名约定,因为我发现从长远来看,在edmx文件中更改它很容易。现在我正在尝试了解如何将查找(国家列表)分配给用户单击“编辑”时动态生成的下拉列表。我认为这是一个令人震惊的问题,而不是一个breezejs。感谢您提供此解决方案。它忽略nameOnServer属性让我抓狂。我只想让所有内容(客户端和服务器)都成为现实!