如何在Linq to SQL中创建多对多的关系?

时间:2010-02-26 19:12:07

标签: linq-to-sql

我有一个User表,Roles表和一个链接表User2Roles。我想创建LinqToSQL实体,以便我可以手动访问用户角色.Users和user.Roles。使用设计器它实际上创建了3个实体,User to User2Roles和User2Roles to Roles。

3 个答案:

答案 0 :(得分:0)

不幸的是,我相信你被这个临时实体所困扰。据我所知,Linq to SQL并不像你想的那样以一种干净的方式支持多对多的连接。代码中有一些变通方法可以使对象模型至少出现,以便以你想要的方式为manys提供支持。

Check out this post on SO
或者link

答案 1 :(得分:0)

您可以在角色和用户类中创建自己的属性。此属性的目的是获取当前角色的用户并将结果作为集合返回。然后你可以为其他班级做同样的事情。

以下是一些没有测试的代码(一旦我可以回到我的开发框就会被替换)

partial class Roles
{
  List<users> Users
  {
    get { return User2Roles.users.toList(); }
  }
}

partial class Users
{
  List<roles> Roles
  {
    get { return User2Roles.roles.toList(); }
  }
}

答案 2 :(得分:0)

您无法在Linq to SQL中实际创建多对多关系。但是,您可以轻松地为它创建自己的“糖”。

public partial class User
{
    public IQueryable<Role> Roles
    {
        get { return UserRoles.Select(ur => ur.Role); }
    }
}

public partial class Role
{
    public IQueryable<User> Users
    {
        get { return UserRoles.Select(ur => ur.User); }
    }
}

这就是它的全部内容。这将为您节省总是必须处理中间实体的麻烦。您可以针对它编写代码,就好像它是真正的M:M关系:

foreach (Role role in user.Roles) { ... }

您甚至可以在查询投影中使用它(尽管在过滤器中使用它时可能会遇到一些问题)。