Javascript Breezejs自动GUID解析

Javascript Breezejs自动GUID解析,javascript,breeze,Javascript,Breeze,我在“NoDB”模式下使用breezjs,这意味着我手工编写元数据。当我用OData参数创建一个Breeze查询时,我添加了一个id过滤器,比如 new breeze.Predicate('iD', datacontext.breeze.FilterQueryOp.Equals, myId) var myId实际上是一个GUID值(尽管它被定义为一个字符串),但在我的数据库以及服务器端和客户端模型中,它都是一个字符串(我无法更改数据库结构)。我的元数据模型中的属性定义是 dataPropert

我在“NoDB”模式下使用breezjs,这意味着我手工编写元数据。当我用OData参数创建一个Breeze查询时,我添加了一个id过滤器,比如

new breeze.Predicate('iD', datacontext.breeze.FilterQueryOp.Equals, myId)
var myId实际上是一个GUID值(尽管它被定义为一个字符串),但在我的数据库以及服务器端和客户端模型中,它都是一个字符串(我无法更改数据库结构)。我的元数据模型中的属性定义是

dataProperties: {
    ...
    iD: { dataType: DataType.String },
    ...
}
(我知道属性名看起来很奇怪,但我必须使用这种语法,因为我的datacontext上有breeze.NamingConvention.camelCase.setAsDefault(),DB上的属性名是ID uppercased) 当我执行查询时,我看到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。一旦具有实体类型,它就可以正确格式化此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