我在'NoDB'模式下使用Breezejs,这意味着我手工编写了我的元数据。当我使用OData参数创建Breeze查询时,我按id添加一个过滤器,比如说
new breeze.Predicate('iD', datacontext.breeze.FilterQueryOp.Equals, myId)
var myId确实是一个GUID值(尽管它定义为String),但在我的数据库中以及我的服务器端和客户端模型中,它都是一个字符串(我无法更改数据库结构)。我的元数据模型中的属性定义是
dataProperties: {
...
iD: { dataType: DataType.String },
...
}
(我知道属性名称看起来很奇怪,但我必须使用这种语法,因为我的datacontext上有breeze.NamingConvention.camelCase.setAsDefault(),而DB上的属性名称是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的官方网站上没有找到任何相关信息。
答案 0 :(得分:2)
Breeze使用其元数据来确定查询中每个属性的数据类型,然后使用此信息生成正确的OData过滤器。因此,ID作为字符串的元数据定义应该是正确的。
但是,为了执行此操作,breeze需要知道查询的EntityType。例如,在以下查询中
var q = EntityQuery.from("Foo").where(....)
breeze需要知道“Foo”(resourceName)对应的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