2010-02-26 3 views
1

J'ai une table utilisateur, une table de rôles et une table de liens User2Roles. Je veux créer des entités LinqToSQL afin que je puisse accéder aux rôles de l'utilisateur en tant que role.Users et user.Roles manuellement. En utilisant concepteur, il crée en fait 3 entités, User to User2Roles et User2Roles to Roles.Comment créer de nombreuses relations dans Linq to SQL?

+1

Vous savez qu'il est généralement bon d'accepter une réponse ou d'apporter des précisions si les réponses ne correspondent pas à vos attentes. – Eric

Répondre

0

Malheureusement je crois que vous êtes coincé avec cette entité intérimaire. Pour autant que je sache, Linq to SQL ne supporte pas beaucoup de jonctions de manière propre comme vous le pensez. Il existe des solutions de contournement dans le code pour que le modèle d'objet au moins apparaissent pour prendre en charge de nombreux manys comme vous le souhaitez.

Check out this post on SO
Ou cette link

0

Vous pouvez créer votre propre propriété dans les classes de rôle et de l'utilisateur. Le but de cette propriété est d'obtenir les utilisateurs pour le rôle actuel et de renvoyer les résultats en tant que collection. Ensuite, vous pouvez faire la même chose pour l'autre classe.

Voici une partie sans essai (sera remplacé une fois que je peux revenir à ma boîte de dev)

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

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

Vous ne pouvez pas créer en fait un grand nombre à plusieurs dans LINQ to SQL. Cependant, vous pouvez facilement créer votre propre "sucre" pour cela.

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); } 
    } 
} 

C'est à peu près tout ce qu'il y a à faire. Cela vous évitera de devoir traiter avec l'entité intermédiaire. Vous pouvez écrire un code contre elle, comme si elle était un vrai M: relation M:

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

Vous devriez même pouvoir l'utiliser dans les projections de requêtes (bien que vous aurez probablement des problèmes à l'aide dans les filtres).

+0

Pourquoi IEnumerable? Je rendrais les propriétés IQueryable de retour afin de retarder l'exécution ...? – Eric

+0

@Eric: Bon point. Je pense que Linq to SQL reconnaîtrait que 'IEnumerable' implémente aussi' IQueryable', mais mieux vaut le rendre explicite. – Aaronaught

+0

Plus j'y pense, plus je pense que tu as raison. Je suppose que IEnumerable est probablement aussi bon, puisque la requête ne s'exécutera pas tant que vous n'aurez pas déplacé l'énumérateur à une valeur réelle et que vous ne l'aurez pas lu. – Eric