2

我需要一些帮助,在许多情况下向用户添加角色。EF Codefirst更新多对多

所以我有User很多RoleRole有很多User

我想我目前Update()方法在我的存储库不会工作。我如何构建一个存储库方法,允许我删除所有以前的角色并向用户添加新角色?

这是我目前有:

public User UpdateUser(User user, IEnumerable<Expression<Func<User, object>>> properties) 
    { 
     if (string.IsNullOrEmpty(user.UserId)) 
     { 
      throw new InvalidOperationException("user does not exist"); 
     } 
     else 
     { 
      db.Users.Attach(user); 
      foreach (var selector in properties) 
      { 
       string propertyName = Helpers.PropertyToString(selector.Body); 
       db.Entry(user).Property(propertyName).IsModified = true; 
      } 

     } 

     db.SaveChanges(); 
     return user; 
    } 

这是更新用户的正确方法?我假设一切都是分离的。这是我如何调用该给角色添加到用户:

 User user = new User(); 
     user.UserId = userId; 
     user.Roles = new Domain.Role{ RoleId = 1}; //Assuming there is a role with ID = 1 
     userRepo.UpdateUser(user, new List<Expression<Func<User, object>>> 
             { 
              u => u.Roles 
             }); 

回答

1

如果你在一个分离的情况是工作,你可能要考虑的对象状态管理。有关更多信息,请参阅这两个答案。

Entity Framework Code First - Add Child Entity to Parent by Primary Key

Save a relation with between two entities an N-N association

第一个是一个简单的例子,其中单个子而不roundtriping分贝加入。第二个是更复杂的,但我仍然没有找到一个很好的方式来清除关系,而不告诉它删除哪些孩子。

有一种可能性,我还没有看过,它是使用可以从ObjectStateManager获得的RelationshipManager。它包含一些方法来获得相关的集合,所以也许你可以以某种方式使用它。