javascript - Breezejs自动GUID解析

标签 javascript breeze

我在“NoDB”模式下使用 Breezejs,这意味着我手动编写元数据。当我使用 OData 参数创建 Breeze 查询时,我按 id 添加过滤器,例如

new breeze.Predicate('iD', datacontext.breeze.FilterQueryOp.Equals, myId)

var myId 确实是一个 GUID 值(尽管它被定义为字符串),但在我的数据库以及我的服务器端和客户端模型中它是一个字符串(我无法更改数据库结构)。我的元数据模型中的属性定义是

dataProperties: {
    ...
    iD: { dataType: DataType.String },
    ...
}

(我知道属性名称看起来很奇怪,但我必须使用此语法,因为我的数据上下文上有 Breeze.NamingConvention.camelCase.setAsDefault(),并且数据库上的属性名称是 ID 大写) 当我执行查询时,我看到 WebAPI url 中相应的 oData 过滤器选项如下

$filter=ID eq guid'65BEB144-5C0C-4481-AC70-5E61FDAA840D'

这导致我出现此服务器错误:类型“System.Guid”和“System.String”之间未定义强制运算符。 有没有办法禁用 GUID 的自动“解析”并将它们保留为字符串? 我暂时解决了这个问题,方法是直接删除 Breeze 源代码中的解析,以便我的 webAPI 调用看起来像

$filter=ID eq '65BEB144-5C0C-4481-AC70-5E61FDAA840D'

但我不喜欢这个解决方案,如果有更好的解决方案,比如以某种方式参数化这种行为,我会很高兴。我在Breeze的官方网站上没有找到任何相关信息。

最佳答案

Breeze 使用其元数据来确定查询中每个属性的数据类型,然后使用此信息生成正确的 OData 过滤器。因此,您将 ID 的元数据定义为字符串应该是正确的。

但是,为了执行此操作,breeze 需要知道查询的 EntityType。例如在以下查询中

var q = EntityQuery.from("Foo").where(....)

breeze 需要知道“Foo”(资源名称)对应的 EntityType。一旦拥有实体类型,它就可以针对该实体类型的特定属性正确格式化任何过滤器。如果 Breeze 没有“EntityType”,那么它会回退到猜测每个属性的数据类型。在您的情况下,它猜测数据类型是“Guid”

因此解决方法是直接告诉查询您正在查询的 EntityType

var q = breeze.EntityQuery.from("Foo).where(....).toType(FoosEntityType);

或者您可以通过 MetadataStore.setEntityTypeForResourceName 方法更全局地处理它。

breeze.MetadataStore.setEntityTypeForResourceName("Foo", FoosEntityType);
var q = breeze.EntityQuery.from("Foo).where(....); // your original query

关于javascript - Breezejs自动GUID解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22249456/

相关文章:

c# - 检测到具有不兼容类型的二元运算符。发现操作数类型 edm.string 和 edm.guid 的种类相等

java - Breezejs 和 Java

breeze - 我可以将breeze.js 与SQLite 或本地数据库一起使用吗?

javascript - Ajax 中的计时器 - 抢占

javascript - lodash.js 语法错误 : Unexpected token )

javascript - 如何处理 javascript 作用域

javascript - 如何使用排序方法按字母顺序对姓氏列表进行排序

breeze - 限制 Breeze.js 中新实体的创建

javascript - Breezejs 自定义 backingStore 适配器

javascript - node.js mongodb find()结果到数组但不使用.filter