2012-11-23 5 views
0

J'ai deux entités dans une application MVC:Code mvc modelant multiples relations - exemple simple

public class User 
{ 
    public int ID {get; set;} 
    public string Forename {get; set;} 
    public string Surname {get;set;} 
} 

public class SubGroup 
{ 
    public int ID {get;set;} 
    public string Name {get;set;} 
} 

et je veux utiliser le code d'abord pour créer une relation entre eux. La relation est que chaque utilisateur peut être membre de 0 ou plusieurs sous-groupes.

S'il vous plaît quelqu'un peut-il suggérer la meilleure façon de le faire parce que j'ai vu quelques exemples sur SO et je suis confus. J'ai vu des choses sur l'implémentation d'ICollections dans une classe, d'autres choses sur l'utilisation de l'API fluide.

Répondre

1

ICollections approche: MISE à JOUR:

Si je comprends bien vous avez beaucoup à plusieurs rapports (groupe ont de nombreux utilisateurs, l'utilisateur ont peut être dans de nombreux groupes), dans ce cas de code devrait ressembler à ceci:

 public class RelationExampleContext : DbContext 
{ 
    public DbSet<User> Users { get; set; } 
    public DbSet<SubGroup> SubGroups { get; set; } 

} 


public class User 
{ 
    [Key] 
    public int ID { get; set; } 
    public string Forename { get; set; } 
    public string Surname { get; set; } 

    public ICollection<SubGroup> SubGroups { get; set; } 
} 

public class SubGroup 
{ 
    [Key] 
    public int ID { get; set; } 
    public string Name { get; set; } 

    public ICollection<User> Users { get; set; } 
} 

Ajout d'utilisateurs à des groupes: par exemple

var db = new RelationExampleContext(); 

var subGroups = new List<SubGroup> 
           { 
            new SubGroup() {Name = "Subgroup1"}, 
            new SubGroup() {Name = "Subgroup2"} 
           }; 

      var users = new List<User> 
          { 
           new User() 
            { 
             Forename = "Forename1", 
             Surname = "Surname1", 
             SubGroups = new List<SubGroup> 
                 { 
                  subGroups.First(), 
                  subGroups.Last() 
                 } 
            }, 
           new User() 
            { 
             Forename = "Forename2", 
             Surname = "Surname2", 
             SubGroups = new List<SubGroup> 
                 { 
                  subGroups.First() 
                 } 
            } 
          }; 

      foreach (var subGroup in subGroups) 
      { 
       db.SubGroups.Add(subGroup); 
      } 

      foreach (var user in users) 
      { 
       db.Users.Add(user); 
      } 

      db.SaveChanges(); 
+0

Ceci est une excellente réponse et tout ce que je cherchais - merci! Que dois-je faire dans Visual Studio 2010 pour voir le diagramme de relation comme celui que vous avez posté ci-dessus? – markp3rry

+0

Pour afficher le diagramme, vous devez générer le modèle edmx. Mais le modèle EDMX ne nécessite pas si vous choisissez l'approche CodeFirst. Le modèle edmx est souvent utilisé avec la première approche de DataBase ou le modèle en premier. Mais si vous voulez toujours ajouter un modèle edmx, vous pouvez le créer dans le menu: Ajouter> Nouvel élément> Modèle de données d'entité ADO.NET> Générer à partir de la base de données. – testCoder

+0

J'ai initialisé certaines données dans ContextInitializer. J'ai créé deux nouveaux utilisateurs et les ai ajoutés au contexte. Ensuite, j'ai créé deux nouveaux sous-groupes et ajouté une nouvelle liste () à chacun. Le premier utilisateur est un membre des groupes 1 et 2, le second un membre du groupe juste le groupe 1. Mais quand je fais une requête, il montre le SubGroupID pour le groupe 1 seulement. Qu'est-ce que je fais mal? – markp3rry

1

Je suppose que l'utilisateur et SubGroup a les mêmes tables dans la base de données dont vous avez besoin de créer table de relation entre ces tables (champs user_id, group_id) modèle pour une nouvelle entité comme UserGroups

et vous pouvez créer la composition dans la classe d'utilisateur

+0

OK, donc créer une autre table. Que voulez-vous dire par "créer une composition dans la classe User"? – markp3rry

+0

Je pensais que vous avez demandé à propos de pattern Composite http://en.wikipedia.org/wiki/Composite_pattern je veux dire quelque chose comme ça ' UserGrops de recueil HSC public class { __construct public (UserId) {} ​​ public function getGrops() {....} ...} public class utilisateur {// nouvelle propriété userGrops // ajouter la méthode grops public function() { this.userGroups = new UserGrops (ce. ID) } } et vous pouvez utiliser la construction user.grops.getGrops() ' Je recueil HSC espère que vous comprenez idée que je utilise un autre langage de programmation – san4o