我正在編寫一個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服務器的多對多關係。
感謝蕾拉,我是不知道的AddLink()和DeleteLink()的功能。我已經嘗試過了,他們確實允許在隱藏的連接表中創建和刪除多對多連接條目。我唯一的問題是,如果鏈接已經存在,AddLink()會引發異常,我似乎無法找到從客戶端檢測鏈接的方式。所以現在我默默地處理客戶端上的異常,如果在調用AddLink()時鏈接已經存在。同樣,如果鏈接不存在,DeleteLink()將失敗。 – 2014-12-05 14:23:08
Richard,要解決此問題,您實際上可以查詢此用戶的權限。 dsc.Users.AddQueryOption(「$ filter」,「UserId eq 1」)。AddQueryOption(「$ expand」,「Permissions($ select = PermissionId)」)。ToList(); – 2014-12-08 02:28:11