2013-07-22 26 views
1

我是breezejs的新手。我試圖在客戶端中定義我的實體類型,而不從服務器獲取元數據。我在服務器實體中有一個名爲ID的屬性。breezejs addEntityType問題

我已經默認使用下面的代碼在客戶端的駱駝案件的命名約定。

breeze.NamingConvention.camelCase.setAsDefault(); 

所以,我開始如下

store.addEntityType({ 
     shortName: "Photo", 
     namespace: "MyProj.Models", 
     dataProperties: { 
      id: { 
       dataType: DataType.Guid, 
       isNullable: false, 
       isPartOfKey: true 
      }, 
      title: { 
       dataType: DataType.String 
      }, 
      description: { 
       dataType: DataType.String 
      }, 
      createdDate: { 
       dataType: DataType.DateTime 
      }, 
     } 
    }); 

這一切工作正常,除了id字段沒有得到正確的值映射的實體。相反,它具有由breeze數據類型ctor設置的默認值,該值等於Guid.Empty

通過逐步調試breezejs調試腳本,我發現它在來自ajax請求的數據中尋找名爲Id的屬性名稱。但它無法找到它,因爲該屬性爲ID,因此它將其初始化爲empty guid字符串。我假設通過設置dataPropertyidnameOnServer屬性,我將能夠修復它。

store.addEntityType({ 
     shortName: "Photo", 
     namespace: "MyProj.Models", 
     dataProperties: { 
      id: { 
       dataType: DataType.Guid, 
       isNullable: false, 
       nameOnServer: 'ID', 
       isPartOfKey: true 
      }, 
      title: { 
       dataType: DataType.String 
      }, 
      description: { 
       dataType: DataType.String 
      }, 
      createdDate: { 
       dataType: DataType.DateTime 
      }, 
     } 
    }); 

但它沒有奏效。

進一步挖掘breez.debug.js代碼,在線路7154上的方法updateClientServerNames上,似乎忽略了我定義的nameOnServer

我在這裏錯過了什麼嗎?

+0

我註釋了'breeze.NamingConvention.camelCase.setAsDefault();'行並相應地改變了映射的細節(即將它們改爲'PascalCase'。它可以很好地工作,但我希望它能在'camelCase'上工作。這是javaScript標準,任何幫助真的很感謝 – Amila

回答

1

好吧,感覺我通過微風文件度過了我的整個生命。反正,終於解決了這個問題。說實話,這不是微風中的問題(但我想知道爲什麼當我提供一個時,它不會覆蓋實際的nameOnServer)。這是數據庫實施早期階段(可能是6年前)開發人員犯的一個錯誤。如果數據庫遵守Pascal Case命名約定,那麼事情就會很好地工作。

作爲一種解決方案,我編寫了一個自定義命名約定,用於在名稱中包含ID時更正命名約定錯誤,並將其與camelCase命名約定結合使用。

var createInconsistenIDConvention = function() { 
var serverPropertyNameToClient = function (serverPropertyName, prop) { 

    if (prop && prop.isDataProperty && (prop.nameOnServer && prop.nameOnServer === "ID")) { 
     return "id"; 
    } else { 
     var firstSection = serverPropertyName.substr(0, 1).toLowerCase(); 
     var idSection = ""; 
     if (serverPropertyName.substr(1).indexOf("ID") != -1) { 
      firstSection += serverPropertyName.substr(1, serverPropertyName.substr(1).indexOf("ID")).toLowerCase() + "Id"; 
     } else { 
      firstSection += serverPropertyName.substr(1); 
     } 

     return firstSection; 
    } 
} 
var clientPropertyNameToServer = function (clientPropertyName, prop) { 
    if (prop && prop.isDataProperty && (prop.nameOnServer && prop.nameOnServer.indexOf("ID") != -1)) { 
     return prop.nameOnServer; 
    } else { 
     return clientPropertyName.substr(0, 1).toUpperCase() + clientPropertyName.substr(1); 
    } 
} 
return new breeze.NamingConvention({ 
    name: "inconsistenID", 
    serverPropertyNameToClient: serverPropertyNameToClient, 
    clientPropertyNameToServer: clientPropertyNameToServer 
}); 
}; 

不知道我使用nameOnServer屬性的方式是否不正確。在breeze網站上我找不到任何文檔。

請注意,上面的代碼只考慮像ID,CountryID,遊戲ID,是PersonID等

問題解決了,現在的情況。

+0

Amila,感謝您的評論我們需要做更好的工作來記錄元數據,比如nameOnServer vs name以及相關的規則,試圖將一些文檔加入網站在接下來的幾天內,但我們仍然會有更多的添加。:) –

+0

嗨周杰倫。如果你遵循教程,它有助於理解事情,並且,如果出現錯誤,我會在Chrome控制檯中調試幾個小時。這樣做有助於我理解大部分內容。事實上,我沒有使用上述命名約定,因爲我發現從長遠來看,它很容易在edmx文件中進行更改。現在我試圖找出如何將查找(國家列表)分配給用戶單擊編輯時動態生成的下拉列表。這是一個淘汰賽問題,而不是我認爲的微風。 – Amila

+0

感謝您使用此解決方案。這讓我發瘋,它忽略了nameOnServer屬性。我只想要一切,客戶端和服務器,都是camelCase! – jdobry