gpt4 book ai didi

javascript - Breeze EntityQuery缺少返回的EntityTypes中的数据

转载 作者:行者123 更新时间:2023-11-30 12:48:39 25 4
gpt4 key购买 nike

我正在使用Angular和Breeze设置SPA。我一直在复数网站上关注John Papa的热毛巾教程。我有一个奇怪的问题,我想可能是我的元数据产生的?但是最后,我不确定。

首先,我的API在LAMP堆栈上运行,所以我没有使用EF。我创建了一个Metadata端点,我认为该端点可以为我提供所需的正确结构。我正在使用breeze.angular.q.js来帮助我从Q映射到$ q

资源:api / v1 / Metadata

{
"metadataVersion": "1.0.5",
"dataServices": [
{
"serviceName": "api/v1/",
"hasServerMetadata": true,
"jsonResultsAdapter": "webApi_default",
"useJsonp": false
}
],
"structuralTypes": [
{
"shortName": "tracks",
"namespace": "MyNamespace",
"dataProperties": [
{
"name": "id",
"nameOnServer": "id",
"maxLength": 36,
"validators": [],
"dataType": "Guid",
"isPartOfKey": true
},
{
"name": "title",
"nameOnServer": "title",
"maxLength": 255,
"validators": [],
"dataType": "String"
},
{
"name": "description",
"nameOnServer": "description",
"maxLength": 0,
"validators": [],
"dataType": "String"
}
]
}
]
}


示例API返回数据如下所示:

资源:api / v1 / tracks

{
"data": [
{
"id": "495f21d6-adfc-40b6-a41c-fc93d9275e24",
"title": "harum",
"description": "Error doloribus ipsam et sunt fugiat."
},
{
"id": "d7b141d2-6523-4777-8b5a-3d47cc23a0fe",
"title": "necessitatibus",
"description": "Voluptatem odit nulla maiores minima eius et."
}
],
"embeds": [
"courses"
]
}


现在,使用所有代码,实际上是从api返回正确的数据。我倾倒了来自微风站点的示例,这些都是我在SO( like this question and great answer from ward)上找到的一些不错的花絮。 las,没有运气。本质上发生的是,当我尝试遍历从微风查询返回的视图模型中的结果时,出现角度误差 Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys. Repeater: t in vm.tracks, Duplicate key: object:00I

调用发生在我的数据上下文内的函数中。我的querySucceeded promise回调中返回的数据似乎未正确绑定。

datacontext.js

...
function getTrackPartials() {
...
return EntityQuery.from(entityNames.track)
.toType(entityNames.track)
.using(manager).execute()
.then(querySucceeded, _queryFailed);

function querySucceeded(data) {
console.log(data); // <-- Log out to see what is returned
tracks = data.results;
_areTracksLoaded(true)
log('Retrieved [Track Partials] from remote data source', tracks.length, true);
return tracks;
}
}


如果我将这些数据注销到控制台,则会得到此信息(所有$$ hashKey都相同,并且id,title,description全部为NULL。但是我确实得到了正确的结果数,而这是“巧合-如果我调整了我应该收到的结果数,则每次都正确匹配)。



现在,由于我的数据返回了一些差异-我使用了 Edmonds example并创建了一个自定义的 JsonResultsAdapter,因此我可以“按摩”数据。目前,它还很初级,因为我只是想让它正常工作。真正使我失望的是,如果我从 node中的 visitNode函数注销 JsonResultsAdapter参数,它具有正确的数据。

EntityManagerFactory.js

(function () {
'use strict';

var serviceId = 'entityManagerFactory';
angular.module('app').factory(serviceId, ['config', emFactory]);

function emFactory(config) {
breeze.config.initializeAdapterInstance('modelLibrary', 'backingStore', true);
breeze.NamingConvention.camelCase.setAsDefault();

var serviceName = config.remoteServiceName;
var metadataStore = new breeze.MetadataStore();

var provider = {
metadataStore: metadataStore,
newManager: newManager
};

var jsonResultsAdapter = new breeze.JsonResultsAdapter({
name: "Tracks",
extractResults: function(json) {
console.log(json.results.data); // <-- Log out to see what is returned
return json.results.data;
},
visitNode: function(node, mappingContext, nodeContext) {
console.log(node); // <-- Log out to see what is returned
return {
entityType: 'tracks',
nodeId: node.id
};
}
});

var dataService = new breeze.DataService({
serviceName: serviceName,
jsonResultsAdapter: jsonResultsAdapter
});

return provider;

function newManager() {
var mgr = new breeze.EntityManager({
dataService: dataService,
metadataStore: metadataStore
});

return mgr
}
}
})();


这是我的JsonResultsAdapter :: extractResults函数的返回值


这是我的JsonResultsAdapter :: visitNode函数的一个节点


任何帮助,将不胜感激。就像我说的那样,我不太确定错误发生在哪里?但是,如果我不得不猜测,我会说使用管理器的EntityQuery和JsonResultsAdapter之间存在一些断开连接,这可能是由于我生成的元数据不正确造成的。

**更新**

因此,我遍历了轻而易举的代码,找出了丢失数据的位置,并且能够弄清楚发生了什么,并找到了一种解决方法。但是,我不确定这是否是实际处理此问题的最佳方法。

我应该提到,我使用bower来安装微风-这样,我进入了 bower-breeze-angular git://github.com/eggers/bower-breeze-angular.git程序包,而不是默认的微风 breeze git://github.com/IdeaBlade/Breeze.git,该微风充斥了示例和其他我不希望打包到存储库中的数据。

轻而易举地,在我的 JsonResultsAdapter::visitnode回调返回之后,它需要“ merge”我的数据,我遇到的问题是从节点返回的 entityKey不匹配。这是因为我 mappingContext中的 rawValueFn正在寻找 nameOnServer,我以为我是从服务器中的元数据中设置的-但是以某种方式注销数据属性时,它与我设置的内容有所不同。

这是一个已注销的dp,如果您回头查看我的元数据资源调用中的顶部,则将其专门设置为“ id”。如何更改为ID?多数民众赞成在什么引起我的头痛!



我可以通过在我的 JsonResultsAdapter中更新我的mappingContext上的rawValueFn函数来解决此问题,并且一切都会正常进行-但这感觉像是“黑客”。我也尝试过使用“ NamingConvention”游戏,但这似乎也不起作用。

这是我更新的JsonFactory,使其工作

    var jsonResultsAdapter = new breeze.JsonResultsAdapter({
name: "Tracks",
extractResults: function(json) {
return json.results.data;
},
visitNode: function(node, mappingContext, nodeContext) {

// Had to adjust this so it would lowercase and correctly match
mappingContext.rawValueFn = function(rawEntity, dp) {
name = dp.name;
name.substring(0, 1).toLowerCase() + name.substring(1);
return rawEntity[name];
}

return {
entityType: 'tracks'
};
}
});

最佳答案

哇,这是一个很长的问题。

首先,我建议您查看"Metadata by hand"主题,该主题描述了使用Breeze Labs元数据帮助器定义元数据的更简单方法。这将减少很多繁琐的工作,并使阅读和理解更加清晰。

其次,不要在您的元数据中指定“ jsonResultsAdapter”。在我看来,实际上是您想要将元数据固定到WebAPI适配器时。请勿在元数据中指定“ namingConvention”,因为这会胜过您在其他地方设置的内容。鉴于您没有从服务器获取元数据,如果您根本不想设置它,则“ hasServerMetadata”应为false

第三,坚持客户端名称,而忽略“ nameOnServer”。 NamingConvention还是要粉碎它。

第四,如果(如所显示的)客户端和服务器端属性名称均为驼峰式,请不要更改NamingConvention默认值!您不需要任何翻译。默认不翻译。

如果我对此表示正确,请不要将NamingConvention更改为camelCase! “ camelCase”约定告诉Breeze“服务器是PascalCase,因此将我的客户端骆驼案例属性名称转换为服务器上的Pascal名称”。如果我理解正确,那么您不希望客户端“ id”成为服务器端“ Id”……这将发生。这就是为什么(我相信)您将“ Id”视为“ nameOnServer”。

第五,在JsonResultsAdapter中,节点名称与服务器中的JSON匹配,因此是服务器端名称。保持这种方式。 NamingConvention将节点属性值转换为实体属性值时,会将其转换为客户端名称。实际上,如果错误地在节点上使用客户端名称,则会丢失数据。

从服务器到达JSON时,您是否需要在JSON中更改属性名称和值?如果没有,请不要在您的visitNode方法中弄混那些名称。关于您要做的所有事情就是确保为节点标识正确的EntityType并将其返回到结果中。

第六,我很确定visitNode结果的“ entityType”属性必须是实际的EntityType,而不是示例中显示的类型名称。你不能说

return {
entityType: 'tracks',
};


您必须给它实类型(我很确定)

return {
entityType: trackType,
};


查看其他Breeze适配器(例如Web API适配器)。它从 EntityType获取 MetadataStore

第七,为什么要设置“ nodeId”?我并不是说您这样做是错误的。但是你应该知道为什么。当同一实体多次出现在有效负载中时,“ nodeId”用于帮助重建对象图。仅当在其他指向“ nodeId”值的节点中带有“ nodeRefId”时,才有用。在这一点上,您只有一种实体而不是关系,设置“ nodeId”并不能完成任何事情。稍后它将...但是仅当您使用有意义的值进行设置时。

我认为您正在执行的操作是将“ nodeId”设置为 Track的主键值。这不是您的情况下的 node.id吗?如果我是对的,那就不要那样做。 “ nodeId”不是您实体的PK。它是使用循环序列化实体图的标记。

哇我的答案很长

我担心您在这里有点不知所措。编写dataService适配器或jsonResultsAdapter不是Breeze初学者的任务。如果您要去那里,请研究现有的适配器并仔细地进行操作。知道为什么他们做他们所要做的而不是去做。

我希望我在这里提供了一些线索。

我怀疑它比您制作的要简单得多。一些关键思想:


确保您没有更改 NamingConvention,除非您确实确实需要在客户端到服务器之间更改属性名称的拼写。
将JsonResultsAdapter中的“ entityType”设置为 EntityType,而不是类型的名称。
不要重写 rawValueFn这样的微风函数;你会打破微风,你将不知道如何或为什么。

关于javascript - Breeze EntityQuery缺少返回的EntityTypes中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21744838/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com