Я использую EF 4 Feature CTP 4.
У меня есть следующая схема базы данных:
[Пользователи] 1-M [Пользовательские роли] M-1 [Роли]
У меня есть класс User и Role (оба POCO).
Когда я пытаюсь связать существующую роль с пользователем, новая запись вставляется в таблицу Roles вместо того, чтобы вставлять только новую запись в UserRoles.
Скажем, у меня есть Пользователь 1 и я хочу связать его с Ролью 2. Когда я пытаюсь сохранить, я получаю новую запись в Роли с именем «Роль 2» с записью в Пользовательских ролях для вновь созданной роли. Из приведенного ниже кода я ожидал только новую запись в UserRoles с отображением между User и Role.
Вот мои классы POCO, отображение и тестирование.
POCO Классы:
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; }
}
Отображение:
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
});
}
}
Тест:
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);
}
Код для сохранения в хранилище:
public void SaveUser(User user) {
if (user.Id > 0) {
dbContext.Users.Attach(user);
dbContext.MarkAsModified(user);
}
else {
dbContext.Users.Add(user);
}