Я пишу приложение клиентского сервера 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.
Спасибо Layla, я не был осведомлен о функциональности AddLink() и DeleteLink(). Я попробовал их, и они действительно позволяют создавать и удалять ссылки Many to Many в таблицу скрытых соединений. Единственная проблема, с которой я сталкиваюсь, заключается в том, что AddLink() генерирует исключение, если ссылка уже существует, и я не могу найти способ обнаружения наличия ссылки от клиента. Поэтому на данный момент я молча обрабатываю исключение на клиенте, если ссылка уже существует при вызове AddLink(). Аналогично, DeleteLink() завершается с ошибкой, если ссылка не существует. –
Richard, Чтобы обойти эту проблему, вы действительно можете запросить разрешения для этого пользователя. dsc.Users.AddQueryOption («$ filter», «UserId eq 1»). AddQueryOption («$ expand», «Разрешения ($ select = PermissionId)»). ToList(); –