今天在EF4.1 codefirst多对多问题上绕了一点功夫,终于解决了。出现的问题是一个User对应多个Role,一个Role对应多个User。在ORM中应该这样表达的
class User
{
Public virtual ICollection<Role> Roles{get;set;}
}
Class Role
{
Public virtual ICollection<User> Users{get;set;}
}
那么EF会自动生成一张表User_Role表,字段是 UserId, RoleId。
那么在操作员修改User中的Role时。我们必须Remove掉原来User中的Roles的的Item。
如:user.Roles.Clear(); user.Roles.ForEach(t => t.Users.Remove(user));
再往其中添加操作员选择的新的Roles,如:
newRole.ForEach(t =>
{
User.Roles.Add(t);
t.Users.Add(user);
}
注意上面红色下划线那句话,如果有这句话,在执行Update()方法时,EntityState就不是Detached,而是Added。造成Update()方法报错。正确的方法应该去掉那句话,EntityState就为Detached。Update方法就能正确执行。