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);
}
Cela n'a pas fonctionné, même après avoir exposé DetectChanges (pas dans dbContext) –