今天在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方法就能正确执行。