2014-12-04 4 views
0

Я пишу приложение клиентского сервера OData/Entity Framework и не могу получить отношения Many to Many для обновления с клиента на сервер.Odata & Entity Framework, отношения Many to Many не будут обновляться

Сервер OData написан с использованием VS2013 в C# с использованием WCF 5.6 и Entity Framework 6.

База данных просто 3 таблицы, Пользователи, Права доступа и присоединение таблиц UsersPermissions.

Я использую Entity Framework 6, который абстрагирует соединение таблицы UsersPermissions, оставляя только объекты Users и Permissions.

От пользователя Я могу запросить их разрешения без проблем у клиента, использующего 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 сервера и получить ту же проблему.

Если я выполняю вышеуказанный LINQ в приложении сервера OData, он выполняется так, как ожидалось, и запись добавляется в UsersPermissions.

Похоже, проблема возникает только при попытке обновить отношения многих и многих из клиента OData?

В конце этой статьи упоминается, что OData имеет ошибку в освещении многих-многих отношений, но я даже не могу их создать! http://msdn.microsoft.com/en-us/library/vstudio/bb896317(v=vs.100).aspx

Я бы по достоинству оценил любую помощь или предложения по отслеживанию причин, почему я не могу создать отношения многих и многих из клиента OData с сервером OData с использованием EF6.0.

ответ

0

Для добавления отношения между пользователем и разрешения на стороне клиента, пожалуйста, используйте DataServiceContext.AddLink

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

Спасибо Layla, я не был осведомлен о функциональности AddLink() и DeleteLink(). Я попробовал их, и они действительно позволяют создавать и удалять ссылки Many to Many в таблицу скрытых соединений. Единственная проблема, с которой я сталкиваюсь, заключается в том, что AddLink() генерирует исключение, если ссылка уже существует, и я не могу найти способ обнаружения наличия ссылки от клиента. Поэтому на данный момент я молча обрабатываю исключение на клиенте, если ссылка уже существует при вызове AddLink(). Аналогично, DeleteLink() завершается с ошибкой, если ссылка не существует. –

+1

Richard, Чтобы обойти эту проблему, вы действительно можете запросить разрешения для этого пользователя. dsc.Users.AddQueryOption («$ filter», «UserId eq 1»). AddQueryOption («$ expand», «Разрешения ($ select = PermissionId)»). ToList(); –