2013-02-28 105 views
1

我在做使用durandaljs和breezejs的應用程序。我正在嘗試獲取導航屬性的值。我的問題是,當我tryied打電話給在微風這個方法:按需加載相關實體(entityAspect.loadNavigationProperty())

user.entityAspect.loadNavigationProperty("userType"); 

我得到的錯誤「」在「propertyOrExpr」參數必須是「字符串」「」。此錯誤是拋出的代碼後續部分:

var q = new EntityQuery(navProperty.entityType.defaultResourceName); 
var pred = buildNavigationPredicate(entity, navProperty); 
q = q.where(pred); 

的問題是,「預解碼」是空的,因爲「buildNavigationPredicate」返回NULL。漸入「buildNavigationPredicate」:

if (navigationProperty.foreignKeyNames.length === 0) return null; 

的問題是,「foreignKeyNames」數組爲空,所有在「navigationProperty」其餘領域都充滿,但我不知道爲什麼,但我沒有按服務器不發送這些信息。 (也是foreignKeyNamesServer是空的)。

有人有同樣的問題嗎?可以是微風的錯誤?

謝謝。

回答

2

昨天我發現瞭解決方案,我沒有時間刷新它。問題在於我的用戶類的定義。我首先使用Web API和EF代碼。我的老用戶類是:

public class User 
{ 
    public Guid Id { get; set;} 
    public string UserName { get; set; } 
    public string Password { get; set; } 
    public bool Active { get; set; } 

    public virtual UserType UserType { get; set;} 
} 

做功的user.loadNavigationProperty(「用戶類型」),我不得不改變這個老用戶等級:

public class User 
{ 
    public Guid Id { get; set;} 
    public string UserName { get; set; } 
    public string Password { get; set; } 
    public bool Active { get; set; } 

    public Guid UserType_Id { get; set; } 

    [ForeignKey("UserType_Id")] 
    public virtual UserType UserType { get; set;} 
} 

而且這樣做,我解決了問題。但是,我可以爲多對多的關係實施這個解決方案。我發現,做一些研究,目前不支持多對多關係。 所以我唯一能做的就是在多對多的關係中實現一箇中間實體。

非常感謝病房爲您的時間。如果還有其他方法可以解決這個問題,我會很樂意傾聽。謝謝。

+0

直到EF讓你補充它的慣例,我纔沒有別的選擇。人類在心智上抹去'UserType_Id'中的下劃線(_); EF不。如果該屬性被命名爲UserTypeId,則EF將找到它。順便說一句,如果你不想在你的模型類代碼中使用面向數據庫的屬性(我知道我沒有),你可以使用EF流利API來幫助EF理解你的模型。 – Ward 2013-03-04 02:20:45

+1

我們知道有些人希望微風支持多對多。有一個用戶語音項目。我希望人們放棄這個要求,而且我們從不執行。我們將不得不*如果你真的想要它*。但我認爲這是一個可怕的想法......因爲[我已經在其他地方解釋過](http://stackoverflow.com/questions/14902352/breeze-js-error-collection-navigation-properties-may-not-be -組)。與中間實體一起去吧,並且很感激......因爲那天你會爲你感到高興而來。 – Ward 2013-03-04 02:25:22

+0

非常感謝您的回答。我正在使用Fluent Api;但是我認爲使用註釋解釋我的解決方案會更容易。對於多對多的關係,我可以看到你的觀點;我將實施中間實體。謝謝,它幫助我澄清了很多。 – jvrdelafuente 2013-03-04 07:26:56

0

錯誤消息沒有幫助。幸運的是,您已將問題追溯到缺少foreignKeyNames。這表明你在導航屬性的定義中缺少了一些東西。由於某些原因,Breeze未檢測到User中的FK屬性與UserType相關。如果您使用的是Web API和EF,則可以確認在服務器上正確指定了FK。

其實,正確的幫助,我們不得不看到的User類定義,從描述UserUserType服務器中的元數據的一部分(請勿打印整個元!)和快照在運行時返回的EntityType對象從manager.metadataStore.getEntityType('User')

+0

你好,病房,謝謝你的幫助。我自己找到了解決方案。不過,我想知道爲什麼我必須這樣做才能解決問題。如果有什麼不同的方式來解決這個問題,並且還有任何方法來解決多人對接問題。謝謝 – jvrdelafuente 2013-03-03 09:44:30

+0

我會對你的回答發表評論/解釋 – Ward 2013-03-04 02:17:51