EF Codefirst обновить многие ко многим - PullRequest
2 голосов
/ 08 апреля 2011

Мне нужна помощь в добавлении ролей пользователю во многих ситуациях.

Итак, у меня User со многими Role, а Role со многими 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 Ответ

1 голос
/ 08 апреля 2011

Если вы работаете в отдельном сценарии, вы можете заглянуть в диспетчер состояния объекта. Смотрите эти два ответа для получения дополнительной информации.

Код Entity Framework First - добавление дочернего объекта к родителю по первичному ключу

Сохранить связь между двумя сущностями, связанными N-N

Первый пример - простой пример добавления одного потомка без обхода БД. Второй вариант более сложный, но я до сих пор не нашел хорошего способа очистить отношения, не сообщив, каких потомков удалять.

Существует возможность, которую я еще не рассматривал, и она заключается в использовании RelationshipManager, который вы можете получить из ObjectStateManager. Он содержит несколько методов для получения выпущенных коллекций, так что, возможно, вы могли бы использовать это как-то.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...