2013-03-15 34 views
4

我正在開始使用OData和實體框架。OData異常複雜類型'WebTools.Order'通過屬性'Customer'引用實體類型'WebTools.Customer'

我創建了一個公開客戶的控制器。在模型(EDMX)中只有一個實體(客戶),一切正常(數據正在呈現)。

現在,當我添加第二個實體(Order)(從數據庫更新模型,選擇Order)時,會自動設置1對多(1 Customer to Many Order)。

我別的什麼也不做,當我編譯/運行控制,我得到這個錯誤:

Line 23:   builder.EntitySet(Of Customer)("Customers") 
Line 24:   Return builder.GetEdmModel() --> Exception Here 
Line 25: 
Line 26:  End Function 

複雜類型「WebTools.Order」指的是實體類型「WebTools.Customer」通過屬性'顧客'。

如果我刪除訂單實體,它的工作原理。

我不確定問題出在OData/WebAPI部分或「實體框架」的「配置」上。

回答

14

我假設模型構建器無法找出實體類型Order的關鍵屬性。你可以幫忙模型構建器通過一對夫婦的方式,

  1. builder.EntitySet<Order>("orders");。這增加了一個新的實體集'orders',並且還具有將'Order'類型標記爲實體類型的效果。您還必須指定「訂單」的關鍵屬性。

  2. 使用[Key]屬性標記「訂單」類型的關鍵屬性(或屬性)。

  3. 如果你不喜歡的屬性和更喜歡在代碼中這樣做,可以做,builder.EntitySet<Order>("orders").EntityType.HasKey(o => order.KeyProperty);

+0

如果我有客戶實體和其他非關聯到客戶實體(城市或其他),它工作......只要我包含任何「與客戶相關的」實體(來自數據庫的更新模型),它就會失敗。我對EF的理解是,使用「從數據庫更新模型」更新模型將負責處理實體之間的導航/關係(對嗎?)。 – 2013-03-15 18:47:03

+2

不幸的是,此時EF使用的EDM模型與Web API OData使用的EDM模型不同。人們通常不願意直接公開自己的數據庫模型,而是使用DTO來將它們分開。我們正在努力改進模型構建的經驗,以便您只想通過服務公開數據庫模型。在那之前你必須自己建立模型。另外,是否有可能分享您的客戶和訂單類?只是想看看爲什麼ODataModelBuilder無法正確推斷它。 – 2013-03-15 20:43:36

+0

非常好,謝謝。我完全同意你對直接暴露數據庫模型的評論,我只是向我的團隊炫耀OData。謝謝 – 2013-03-16 12:20:26