2

J'ai besoin d'aide sur l'ajout de rôles à l'utilisateur dans une situation beaucoup plus.EF Codefirst mise à jour de nombreux à plusieurs

Donc j'ai User avec beaucoup Role et Role a beaucoup User.

J'ai pensé que ma méthode actuelle Update() dans mon référentiel ne fonctionnera pas. Comment puis-je créer une méthode de référentiel qui me permet de supprimer tous les rôles précédents et d'ajouter de nouveaux rôles à l'utilisateur?

C'est ce que j'ai actuellement:

public User UpdateUser(User user, IEnumerable<Expression<Func<User, object>>> properties) 
    { 
     if (string.IsNullOrEmpty(user.UserId)) 
     { 
      throw new InvalidOperationException("user does not exist"); 
     } 
     else 
     { 
      db.Users.Attach(user); 
      foreach (var selector in properties) 
      { 
       string propertyName = Helpers.PropertyToString(selector.Body); 
       db.Entry(user).Property(propertyName).IsModified = true; 
      } 

     } 

     db.SaveChanges(); 
     return user; 
    } 

Est-ce la bonne façon de mettre à jour un utilisateur? Je suppose tout ce qui est détaché. Voici comment j'appelle cette option pour ajouter des rôles à l'utilisateur:

 User user = new User(); 
     user.UserId = userId; 
     user.Roles = new Domain.Role{ RoleId = 1}; //Assuming there is a role with ID = 1 
     userRepo.UpdateUser(user, new List<Expression<Func<User, object>>> 
             { 
              u => u.Roles 
             }); 

Répondre

1

Si vous travaillez dans un scénario indépendante, que vous pouvez regarder dans le gestionnaire de l'état d'objet. Voir ces deux réponses pour plus d'informations.

Entity Framework Code First - Add Child Entity to Parent by Primary Key

Save a relation with between two entities an N-N association

Le premier est un exemple simple où un seul enfant est ajouté sans roundtriping le db. Le second est plus complexe mais je n'ai toujours pas trouvé un bon moyen d'effacer la relation sans lui dire quels enfants supprimer.

Il y a une possibilité que je n'ai pas encore regardée et c'est d'utiliser le RelationshipManager que vous pouvez obtenir depuis ObjectStateManager. Il contient quelques méthodes pour obtenir des collections releated ainsi peut-être que vous pourriez l'utiliser d'une manière ou d'une autre.

Questions connexes