【问题标题】:Breeze entity query returns object without null propertiesBreeze 实体查询返回没有空属性的对象
【发布时间】:2012-12-18 09:37:11
【问题描述】:

我在 SPA 中使用 breeze.js,但从服务器加载的实体有问题。即,从元数据创建的实体(使用metadataEntityType.createEntity())并添加到实体管理器具有所有属性,如服务器端模型,准备好与敲除绑定,这很酷。

问题是当我使用entityModel.EntityQuery.from("WorkOrders") 时,我传递给它的.then 承诺的successCallback 获得了一个带有results 属性的数据对象,其中包含一个vanilla js 对象数组,其中所有具有value == null 的属性都是丢失(这正是服务器通过线路发送数据的方式,但我想这就是应该的方式,因为微风在客户端上有所有元数据,不需要所有属性都知道它们存在)。

我有我的自定义构造函数,它可以像 createEntity() 中的那样生成成熟的淘汰对象,但我认为必须有更好的方法让微风自动为我处理这个问题。我不确定是否应该将这些对象添加到实体管理器中,因为我认为它们应该已经存在,并且我注册了我的自定义构造函数以使用 entityManager.metadataStore.registerEntityTypeCtor 进行存储,但这并没有改变成功回调得到的结果,它总是很简单JSON 就像从服务器发送的一样。

更新:服务器调用返回json有效载荷的方法代码为

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

正如@Jay 在其回答和评论中指出的那样,这可能是行为的原因。这是返回的 JSON 负载:

[{"$id":"1","$type":"WorkOrders.Domain.Models.WorkOrder, WorkOrders.Domain","Approved":false,"DateModified":"2013-01-02T22:31:20.897","RequestForEstimate":false,"Id":5}]

【问题讨论】:

    标签: javascript breeze


    【解决方案1】:

    我不太确定我明白你在问什么。您是否希望服务器上具有空值的属性以空值而不是未定义的方式返回给微风客户端,还是我错过了这个问题?

    如果这是问题所在,我同意您想要的内容会很有用,我会将其添加为功能请求。

    您可能想要查看的另一种可能性是使用“registerEntityTypeCtor”方法的第三个参数,它可以让您传入一个初始化函数。对于正在构造的每个实体,该函数将被调用一次,“之后”它已经被物化了。这意味着您可以遍历属性或对象,并将任何值为 'undefined' 的值设置为 'null'

    这有意义吗?

    【讨论】:

    • 是的,你明白这个问题,但是属性是否从服务器发送对我来说并不重要,我只想拥有相同的对象,如果它是从服务器加载或重新创建的。我将检查这第三个参数是否为我解决了问题。这意味着不会为通过网络传输的对象调用构造函数(默认或自定义)?
    • 注册的构造函数总是被调用,无论实体是通过查询创建还是物化。我怀疑您的查询没有返回实体。我假设您使用的是 Web API 控制器;也许操作方法('MyCollection'?)没有返回元数据中实体类型的 IQueryable。 “MyCollection”是一个查询方法的奇怪名称。判断是否有实体的快速方法是在成功回调中设置断点并检查data.results[0].entityType;如果该属性返回 undefined,则您没有返回实体。
    • 越来越近了!您已确认客户认为结果不是实体。它将它们视为任意对象,很乐意返回,但它们不是实体,Breeze 不会将它们放入缓存中。现在,有效负载告诉我们您正在接收 WorkOrder 类型的 JSON。因此,让我们看看客户端是否识别该类型。在成功回调中运行 var store = myEntityManager.metadataStore; store.getEntityType("WorkOrder"); 后的“x”是什么?如果为空,则不好。如果为 null,var y = store.getEntityTypes; 中的 'y' 是什么?
    • 您可以将其称为错误 ... 或已记录的功能 :) 请参阅 breezejs.com/documentation/entity-framework-dbcontext-0,其中说“重要:类可以位于不同的程序集中,但模型类命名空间必须与 DbContext/ ObjectContext 命名空间。”它继续解释一个简单的解决方法。我们遇到这种情况是因为 EF 开箱即用的元数据生成不支持模型和上下文的不同命名空间。这让很多人陷入困境,我们可能不得不“让它发挥作用”
    • Aaah,我已经阅读了这部分文档,但是我浏览了这个“多个程序集”部分,因为我的大脑处于搜索模式以找到解决这个问题的方法,但它似乎并不相关,我做到了甚至没有意识到我手上有这种情况。我认为您应该将您的评论复制到答案中,以便我们可以关闭此问题:) 谢谢!
    【解决方案2】:

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

    从 v 0.83.2 开始,Breeze 现在允许模型命名空间不同于 DbContext/ObjectContext 命名空间。

    请确认这是否能解决问题。

    谢谢

    【讨论】:

    • 谢谢,在更新到 0.83.2 之前,我通过重命名上下文命名空间解决了这个问题,更新后它可以与以前的(原始)命名空间一起使用。干得好!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多