2014-03-07 25 views
0

我在「NoDB」模式下使用Breezejs,意思是我寫的手放在我的元數據。當我創建的OData參數的微風查詢我的ID添加過濾器,說Breezejs自動GUID解析

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

的VAR身份識別碼確實是一個GUID值(儘管它定義爲一個字符串),但在我的數據庫,並在我的兩個服務器 - 側和客戶端模型是一個字符串(我不能改變數據庫結構)。在我的元數據模型的屬性定義爲

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

(我知道屬性名字看起來怪異,但我有,因爲我有breeze.NamingConvention.camelCase.setAsDefault(在我的DataContext使用這個語法),和酒店對數據庫名ID大寫) 當我執行查詢我看到,在的WebAPI的URL對應的OData過濾選項是類似

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

這使我這個服務器錯誤:沒有強制經營者之間定義類型'System.Guid'和'System.String'。 有沒有一種方法來禁用的GUID這種自動「解析」,讓他們爲字符串? 我已經暫時解決了這個直接刪除微風的源代碼中的解析,使我的WebAPI調用看起來像

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

,但我不喜歡這樣的解決方案,如果有一個更好的我會很高興,像以某種方式參數化這種行爲。在Breeze的官方網站上我沒有發現任何關於這方面的信息。

回答

2

微風使用其元數據來確定查詢中的每個屬性的該數據類型,然後使用此信息來生成正確的OData濾波器。所以你的ID作爲字符串的元數據定義應該是正確的。

但是,爲了執行此操作,breeze需要知道您的查詢的EntityType。例如在下面的查詢中

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

breeze需要知道「Foo」(a resourceName)對應的EntityType。一旦它具有實體類型,它就可以正確地格式化該實體類型的特定屬性的任何過濾器。如果微風沒有「的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