2010-08-23 6 views
2

J'utilise EF 4 Feature CTP 4.EF 4 Feature CTP 4 - associé plusieurs à plusieurs

je le schéma de base de données suivante:

[Utilisateurs] 1-M [UserRoles] M-1 [ Rôles]

J'ai une classe User et Role (les deux POCO).

Lorsque j'essaie d'associer un rôle existant à un utilisateur, un nouvel enregistrement est inséré dans la table Rôles, au lieu d'insérer uniquement un nouvel enregistrement dans UserRoles. Donc, disons que j'ai l'utilisateur 1 et que je veux associer au rôle 2. Lorsque j'essaie de sauvegarder, je me retrouve avec un nouvel enregistrement dans les rôles nommé «rôle 2» avec un enregistrement dans UserRoles au rôle nouvellement créé. À partir du code ci-dessous, je n'attendais qu'un nouvel enregistrement dans UserRoles avec le mappage entre Utilisateur et Rôle.

Voici mes classes POCO, mappage et test.

POCO Classes:

public class User { 
     public int Id { get; set; } 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public byte[] DataVersion { get; set; } 

     private List<Role> roles = new List<Role>(); 
     public virtual IList<Role> Roles { 
      get { 
       return roles; 
      } 
     } 
    } 

public class Role { 
     public int Id { get; set; } 
     public string Name { get; set; } 

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

Cartographie:

public class UserConfiguration : EntityConfiguration<Domain.User> { 
     public UserConfiguration() { 
      this.MapSingleType(user => new { 
       UserId = user.Id, 
       FirstName = user.FirstName, 
       LastName = user.LastName, 
       DataVersion = user.DataVersion 
      }); 

      this.Property(u => u.DataVersion).IsConcurrencyToken().HasStoreType("timestamp").StoreGeneratedPattern = StoreGeneratedPattern.Computed; 

      //Users <--> Roles 
      this.HasMany(u => u.Roles).WithMany(r => r.Users) 
       .Map("UserRoles", (u, r) => new { 
        UserId = u.Id, 
        RoleId = r.Id 
       }); 
     } 
    } 

public class RoleConfiguration : EntityConfiguration<Domain.Role> { 
     public RoleConfiguration() { 
      this.MapSingleType(role => new { 
       RoleId = role.Id, 
       RoleName = role.Name 
      }); 

     } 
    } 

Test:

public void AssignRoleTest() { 
      var userId = 1; 
      User user; 

      var userRepo = new UsersRepository(); 
      user = userRepo.GetUser(userId); 

      var roleRepo = new RolesRepository(); 

      var roleId = 2; 
      var role = roleRepo.GetRole(roleId); 

      user.Roles.Add(role); 

      userRepo.SaveUser(user); 

    } 
code

pour le dépôt Economie:

public void SaveUser(User user) { 
     if (user.Id > 0) { 
      dbContext.Users.Attach(user); 
      dbContext.MarkAsModified(user); 
     } 
     else { 
      dbContext.Users.Add(user); 
     } 

Répondre

0

Essayez d'utiliser context.DetectChanges() dans votre méthode SaveUser. Cela devrait fonctionner car vous utilisez le même contexte pour charger et sauvegarder le graphe d'entité.

+0

Cela n'a pas fonctionné, même après avoir exposé DetectChanges (pas dans dbContext) –

Questions connexes