2014-12-04 62 views
0

我正在編寫一個OData/Entity Framework客戶端服務器應用程序,並且無法獲取從客戶端更新到服務器的多對多關係。Odata&Entity Framework,多對多關係不會更新

的OData的服務器中使用WCF 5.6 C#使用VS2013寫入,並且實體框架6.

該數據庫是簡單地3個表,用戶權限和接合表UsersPermissions

我正在使用實體框架6,該實體框架6提取加入UsersPermissions表,只留下用戶和權限實體。

從用戶我可以查詢他們的權限沒有問題從客戶端使用LINQ。同樣,我可以從權限查詢用戶,所以多對多的關係很適合閱讀。

如果我嘗試從客戶端創建關係,比如爲用戶添加新的權限,則不會發生任何事情。沒有到服務器的流量,數據庫中的連接表中沒有數據更改。

無論我嘗試向客戶端應用程序中的用戶添加權限,還是使用LinqPad對我的OData源執行查詢,這都是一樣的。

我使用的LINQ(從LinqPad拍攝)是:

// Get permission 
var Permission = (from p in Permissions 
       where p.PermissionId == 1 
       select p).SingleOrDefault(); 

// Get user 
var User = (from u in Users 
       where u.UserId == 1 
       select u).SingleOrDefault(); 

// Add permission to user 
User.Permissions.Add(Permission); 

SaveChanges(); 

我試圖創建一個完全獨立的OData服務器應用程序,並得到了同樣的問題。

如果我在OData服務器應用程序內執行上述LINQ,它將按預期執行,並將條目添加到UsersPermissions。

因此,似乎只有在嘗試從OData客戶端更新多對多關係時才存在問題。

在本文末尾提到OData在刷新多對多關係方面存在一個錯誤,但我甚至無法創建一個! http://msdn.microsoft.com/en-us/library/vstudio/bb896317(v=vs.100).aspx

我會很感激任何幫助或建議,以追蹤爲什麼我不能創建一個OData客戶端使用EF6.0的OData服務器的多對多關係。

回答

0

要添加在客戶端的用戶和權限之間的關係,請使用DataServiceContext.AddLink

dsc.AddLink(User, "Permissions", Permission) 
    dsc.SaveChanges() 
+1

感謝蕾拉,我是不知道的AddLink()和DeleteLink()的功能。我已經嘗試過了,他們確實允許在隱藏的連接表中創建和刪除多對多連接條目。我唯一的問題是,如果鏈接已經存在,AddLink()會引發異常,我似乎無法找到從客戶端檢測鏈接的方式。所以現在我默默地處理客戶端上的異常,如果在調用AddLink()時鏈接已經存在。同樣,如果鏈接不存在,DeleteLink()將失敗。 – 2014-12-05 14:23:08

+1

Richard,要解決此問題,您實際上可以查詢此用戶的權限。 dsc.Users.AddQueryOption(「$ filter」,「UserId eq 1」)。AddQueryOption(「$ expand」,「Permissions($ select = PermissionId)」)。ToList(); – 2014-12-08 02:28:11