【发布时间】:2010-08-23 20:46:19
【问题描述】:
我正在使用 EF 4 Feature CTP 4。
我有以下数据库架构:
[用户] 1-M [用户角色] M-1 [角色]
我有一个用户和角色类(都是 POCO)。
当我尝试将现有角色与用户关联时,将在 Roles 表中插入一条新记录,而不是仅在 UserRoles 中插入一条新记录。
假设我有用户 1 并想与角色 2 关联。当我尝试保存时,我最终在角色中获得了一条名为“角色 2”的新记录,其中用户角色中的记录与新创建的角色有关。从下面的代码中,我期望 UserRoles 中只有一条新记录,其中包含用户和角色之间的映射。
这是我的 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);
}
【问题讨论】:
标签: entity-framework entity-framework-4 poco