我使用的是EF 4 Feature CTP 4。
我有以下数据库架构:
[用户] 1-M [UserRoles] M-1 [角色]
我有一个用户和角色类(两个POCO)。
当我尝试将现有角色与用户关联时,会在Roles表中插入新记录,而不是仅在UserRoles中插入新记录。
所以说我有用户1并希望与角色2关联。当我尝试保存时,我最终在角色中创建一个名为“Role 2”的新记录,其中UserRoles中的记录为新创建的角色。从下面的代码中,我期待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);
}
答案 0 :(得分:0)
尝试在SaveUser方法中使用context.DetectChanges()。它应该工作,因为您正在使用相同的上下文来加载和保存实体图。