Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Breeze实体查询返回不带null属性的对象_Javascript_Breeze - Fatal编程技术网

Javascript Breeze实体查询返回不带null属性的对象

Javascript Breeze实体查询返回不带null属性的对象,javascript,breeze,Javascript,Breeze,我在SPA中使用,从服务器加载的实体有问题。也就是说,从元数据(使用metadataEntityType.createEntity())创建并添加到实体管理器的实体具有所有属性,如服务器端模型,可以使用敲除绑定,这很酷 问题是,当我使用entityModel.EntityQuery.from(“WorkOrders”)时,我传递给它的的successCallback会得到一个带有results属性的数据对象,该属性包含一个普通js对象数组,其中缺少值==null的所有属性(这正是服务器通过网络发

我在SPA中使用,从服务器加载的实体有问题。也就是说,从元数据(使用
metadataEntityType.createEntity()
)创建并添加到实体管理器的实体具有所有属性,如服务器端模型,可以使用敲除绑定,这很酷

问题是,当我使用
entityModel.EntityQuery.from(“WorkOrders”)
时,我传递给它的
的successCallback会得到一个带有results属性的数据对象,该属性包含一个普通js对象数组,其中缺少值==null的所有属性(这正是服务器通过网络发送数据的方式,但我认为这是它的本意,因为breeze在客户端上拥有所有元数据,不需要所有属性就知道它们存在)

我有自己的自定义构造函数,它可以生成完全成熟的敲除对象,就像createEntity()中的对象一样,但我认为一定有更好的方法让breeze自动处理这个问题。我不确定是否应该将这些对象添加到entity manager,因为我认为它们应该已经存在,我使用
entityManager.metadataStore.registerEntityTypeCtor
注册了自定义构造函数来存储,但这不会改变在成功回调时,它始终是纯JSON,就像从服务器发送的一样

更新:在服务器上调用以返回json负载的方法的代码为

[HttpGet]
public IQueryable<WorkOrder> WorkOrders()
{
    return (IQueryable<WorkOrder>)_contextProvider.Context.WorkOrders;
}

我不太确定我是否理解您的要求。是您希望服务器上具有null值的属性以null值而不是未定义的值返回到breeze客户端,还是我忽略了这个问题

如果这是一个问题,我同意你想要的将是有用的,我将添加它作为一个功能请求

您可能需要考虑的另一种可能性是使用“registerEntityTypeCtor”方法的第3个参数,该方法允许您传入初始化函数。对于正在构造的每个实体,该函数将在“之后”被调用一次。这意味着您可以迭代属性或对象并将任何值为“undefined”的设置为“null”


这有意义吗?

此问题是由于模型位于与承载它的DbContext/ObjectContext不同的命名空间中而引起的。以前,这是作为已知限制记录的

从V0.83.2开始,breeze现在允许模型名称空间与DbContext/ObjectContext名称空间不同

请确认这是否解决了问题


谢谢

是的,您理解这个问题,但属性是否从服务器发送对我来说并不重要,我只想在从服务器加载或重新创建时拥有相同的对象。我将检查第三个参数是否为我解决了问题。这意味着构造函数(默认或自定义)没有为通过连接的对象调用?无论实体是通过查询创建的还是通过查询具体化的,都会调用注册构造函数。我怀疑您的查询没有返回实体。我假设您使用的是Web API控制器;可能是操作方法('MyCollection')?)未返回元数据中实体类型的IQueryable。“MyCollection”是查询方法的奇数名称。判断是否有实体的快速方法是在成功回调中设置断点并检查
数据。结果[0].entityType
;如果该属性返回
未定义的
,则您不会返回实体。越来越近!您已确认客户端不认为结果是实体。它将它们视为任意对象,很乐意返回,但它们不是实体,Breeze不会将它们放入缓存中。现在负载告诉我们您正在接收一个
WorkOrder
类型的JSON。因此,让我们看看客户端是否识别该类型。运行
var store=myEntityManager.metadataStore;store.getEntityType(“WorkOrder”)后,“x”是什么;
在成功回调中?如果为null,则不好。如果为null,则
var y=store.getEntityTypes;
中的“y”是什么?您可以将其称为bug…或有文档记录的功能:)查看其中的说明“重要:类可以位于不同的程序集中,但模型类命名空间必须与DbContext/ObjectContext命名空间匹配。”它接着解释了一个简单的解决方法。我们之所以会遇到这种情况,是因为从EF生成的开箱即用元数据不支持模型和上下文的不同名称空间。这让很多人感到痛苦,我们可能不得不“让它工作起来”啊,我已经阅读了这部分文档,但我浏览了这部分“多个组件”,因为我的大脑处于搜索模式,以找到解决这个问题的方法,而这似乎并不相关,我甚至没有意识到我手头上有这种情况。我认为你应该把你的评论复制到一个答案中,这样我们就可以结束这个问题:)谢谢!谢谢,在更新到0.83.2之前,我通过重命名上下文名称空间解决了这个问题,更新之后,它将与以前的(原始)名称空间一起工作。干得好!
[{"$id":"1","$type":"WorkOrders.Domain.Models.WorkOrder, WorkOrders.Domain","Approved":false,"DateModified":"2013-01-02T22:31:20.897","RequestForEstimate":false,"Id":5}]