2010-08-01 5 views
0

Je travaille actuellement sur ma propre version d'adhésion en utilisant Entity Framework 4.0 et POCO. Après avoir lu le post du blog de Scotts Gu, j'ai décidé d'utiliser autant que possible les conventions.Entity Framework 4 (La requête Linq ne retourne pas mes rôles)

Jusqu'à présent, j'ai une classe appelée User:

public class User 
{ 
    [System.ComponentModel.DataAnnotations.Key] 
    public int UserId { get; set; } 

    [System.ComponentModel.DataAnnotations.StringLength(60)] 
    public string UserName { get; set; } 

    public string Password { get; set; } 

    [System.ComponentModel.DataAnnotations.ConcurrencyCheck] 
    public string Email { get; set; } 

    [System.ComponentModel.DataAnnotations.Timestamp] 
    public byte[] Timestamp { get; set; } 

    public ICollection<Role> Roles { get; set; } 
} 

et une classe appelée rôle

public class Role 
{ 
    [System.ComponentModel.DataAnnotations.Key] 
    public int RoleId { get; set; } 

    [System.ComponentModel.DataAnnotations.StringLength(50)] 
    public string RoleName { get; set; } 

    [System.ComponentModel.DataAnnotations.StringLength(300)] 
    public string RoleDescription { get; set; } 

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

Je installe également DbContext comme ceci:

public class BackboneDbContext : DbContext 
{ 
    public DbSet<User> Users { get; set; } 
    public DbSet<Role> Roles { get; set; } 
} 

Ensuite, en fonction de ce Scott a suggéré que j'ai créé une classe Initializer héritant de RecreateDatabaseIfModelChanges.

Ensuite, dans cette classe, j'ajouter quelques éléments factices comme ceci:

protected override void Seed(BackboneDbContext context) 
    { 
     var roles = new List<Role> 
     { 
      new Role 
       { 
        RoleId = 0, 
        RoleName = "User", 
        RoleDescription = "This role belong to normal users.", 
       } 

     }; 

     roles.ForEach(r => context.Roles.Add(r)); 

     var users = new List<User> 
     { 
      new User {UserId = 1, 
         UserName = "Elham", 
         Email = "[email protected]", 
         Password = "xyz", 
         Roles = new List<Role> 
            { 
             roles[0] 
            } 

         } 

     }; 

     users.ForEach(u => context.Users.Add(u)); 
    } 

Je l'espère donner un sens jusqu'ici. Si ce n'est pas le cas, le code ci-dessus remplit les tables avec des données factices si le schéma de base de données change.

Jusqu'à présent, tout est absolument génial. Je reçois les tableaux suivants:

rôles, Roles_Users et les utilisateurs

ils ont tous l'info j'ai besoin, mais le problème est quand j'utilise la requête LINQ suivante dans ma classe Repository pour obtenir tous les utilisateurs:

public IQueryable<User> GetAllUsers() 
    { 
     IQueryable<User> allUsers = from u in _backboneDbContext.Users select u; 

     return allUsers; 
    } 

maintenant si je vérifie AllUsers avant de le transmettre pour voir, je reçois mes utilisateurs mais le rôle est réglé sur « nul »

Je ne sais pas pourquoi ... Des idées? Je vous remercie.

Répondre

2

Essayez de rendre virtuelles vos propriétés ICollection. Cela permet à EF de faire un chargement paresseux de la relation. Alternativement, regardez dans l'utilisation de la méthode Include sur la requête pour charger avec impatience les entités liées.

+0

Merci beaucoup c'était la bonne réponse et son fonctionnement maintenant, j'ai rendu les propriétés virtuelles! :) Je préfère chargement paresseux .... – Raha

2

Vous devez ajouter un attribut [System.ComponentModel.DataAnnotations.Association]. Par exemple:

public class User 
{ 
    // [...] 

    [System.ComponentModel.DataAnnotations.Association("User_Roles", "UserId", "RoleId")] 
    public ICollection<Role> Roles { get; set; } 
} 

public class Role 
{ 
    // [...] 

    [System.ComponentModel.DataAnnotations.Association("Role_Users", "RoleId", "UserId")] 
    public ICollection<User> Users { get; set; } 
} 

Si l'association est destinée à être bi-directionnel, vous devez ajouter cet attribut sur à la fois le User.Roles et les Role.Users propriétés.

+0

Merci pour la réponse Timwi, Je l'ai fait mais malheureusement, il ne fonctionne toujours pas! Je peux voir l'association fonctionner quand j'ajoute ces données de test, parce que dans la table Roles_Users j'obtiens l'association. mais quand je le lis comme avant, je reçois null pour la propriété Role! Vous avez mentionné que pour la propriété Users, je devrais ajouter cet attribut d'association et vous avez utilisé "Role_Users" pour le premier paramètre. est-ce le nom de la table ou juste un nom. Parce que je ne vois pas cette table existe dans ma liste de tables, la seule table d'association que je vois il est: Roles_Users ? – Raha

+0

Je crois que c'est juste un nom. Dans Microsoft SQL Server, il s'agit de la contrainte de clé étrangère entre les tables qui obtiendra ce nom. – Timwi

+0

Timwi, J'ai fait les propriétés virtuelles comme Wubbsy suggéré et son fonctionnement maintenant. Merci pour votre réponse! :) – Raha

Questions connexes