【问题标题】:Odata & Entity Framework, Many to Many relationship won't updateOdata 和实体框架,多对多关系不会更新
【发布时间】:2014-12-04 15:38:42
【问题描述】:

我正在编写一个 OData / Entity Framework 客户端服务器应用程序,但无法将多对多关系从客户端更新到服务器。

OData 服务器是使用 VS2013 在 c# 中使用 WCF 5.6 和 Entity Framework 6 编写的。

数据库只是 3 个表,UsersPermissions 和一个连接表 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 服务器应用程序,但遇到了同样的问题。

如果我在 OData 服务器应用程序中执行上述 LINQ,它会按预期执行并将条目添加到 UsersPermissions。

所以似乎只有在尝试从 OData 客户端更新多对多关系时才存在问题?

本文末尾提到 OData 在刷新多对多关系时存在错误,但我什至无法创建! http://msdn.microsoft.com/en-us/library/vstudio/bb896317(v=vs.100).aspx

如果我有任何帮助或建议,我将不胜感激,因为我无法从 OData 客户端与使用 EF6.0 的 OData 服务器创建多对多关系。

【问题讨论】:

    标签: linq wcf many-to-many odata entity-framework-6


    【解决方案1】:

    要在客户端添加用户和权限之间的关系,请使用 DataServiceContext.AddLink

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

    【讨论】:

    • 谢谢 Layla,我不知道 AddLink() 和 DeleteLink() 的功能。我已经尝试过它们,它们确实允许在隐藏连接表中创建和删除多对多连接条目。我唯一的问题是,如果链接已经存在,AddLink() 会引发异常,而且我似乎无法找到一种方法来检测客户端链接是否存在。因此,如果在调用 AddLink() 时链接已经存在,那么现在我正在默默地处理客户端上的异常。同样,如果链接不存在,DeleteLink() 也会失败。
    • Richard,要解决此问题,您实际上可以查询此用户的权限。 dsc.Users.AddQueryOption("$filter", "UserId eq 1").AddQueryOption("$expand", "Permissions($select=PermissionId)").ToList();
    猜你喜欢
    • 2014-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多