Не удается добавить запись из-за проблемы dynamicproxy с c # и linq

#c# #linq

#c# #linq

Вопрос:

Я вызываю следующую функцию ниже в разных местах. В принципе, у меня есть список пользователей, который заполнен UserListItems. В этой ситуации это жестко запрограммированный список «Менеджеров». Я могу создать список менеджера нормально, но мне нужно запустить этот процесс, чтобы убедиться, что все обновлено. Были ли добавлены, удалены какие-либо менеджеры и т.д. Поэтому я сначала создаю список менеджеров из таблицы участников (это актуально). Затем я получаю список менеджеров, сохраненный в таблице UserList. Предполагается, что приведенный ниже предварительный запрос проверяет, есть ли в таблице членов дополнительные менеджеры, чем в списке пользователей. Если есть дополнительные, их следует добавить как userlistitems. Моя проблема в том, что когда я получаю возможность сохранить изменения, мне выдается следующая ошибка:

Не удается привести объект типа ‘System.Data.Entity.DynamicProxies.ApplicationUser …’для ввода’System.Строка’.

таблица UserListItem является всего лишь таблицей отношений и содержит поля

  • UserListItemId
  • UserListId
  • Идентификатор пользователя

и оба идентификатора пользователя и UserListId, похоже, верны при отладке. Чего мне не хватает?

     public void UpdateManagerList()
    {
        var member = GetUserMember();

        var managerList = db.UserList.Where(u => u.Name == "Managers" amp;amp; u.OrgId == member.OrgId).FirstOrDefault();
        var listId = managerList.O_UserListId;

        // list and user ids for up to date managers.
        List<O_Member> ManagersCur = db.O_MemberWhere(u => u.OrgId == member.OrgId amp;amp; u.Manage == true amp;amp; u.JoinedStored == true).ToList();
        List<string> curUserIds = ManagersCur.Select(u => u.UserId).ToList();

        //list of managers stored in userlist
        List<UserListItem> ManagersList = db.UserListItem.Where(u => u.UserListId == listId).ToList();
        List<string> listUserIds = ManagersList.Select(u => u.UserId).ToList();

        foreach (var item in ManagersCur) 
        {
            var mUser = ManagersList.Where(u => listUserIds.Contains(item.UserId)).FirstOrDefault();
            if (mUser != null)
            {
                continue;
            }
            else
            {
                string userId = item.UserId;
                UserListItem newUser = new UserListItem();
                newUser.UserListId = listId;
                newUser.UserId = userId;
                db.UserListItem.Add(newUser);
                db.SaveChanges();
            }
        }
  

Комментарии:

1. Ваш запрос mUser кажется мне очень забавным — ваше условие where не зависит от u, так почему бы вам просто не протестировать, listUserIds.Contains(item.UserId) например, сделайте свой тест if (!listUserIds.Contains(item.UserId)) , а затем добавьте UserListItem.

2. Кроме того, почему вы делаете .Include(o => i.UserList) — предположительно, это данные, которые вы уже знаете и храните в managerList?

3. И следует ли вам удалять менеджеров из списка, которые больше не назначены менеджерами для любого пользователя?

4. спасибо netmags, я проверю запрос. Я понимаю, что включение было ненужным, но я тестировал вещи и забыл удалить его. Кроме того, удаление менеджеров произойдет в другом foreach, но я убрал это для простоты решения этой проблемы.

5. Ваше первое предложение, если (!listUserIds. Содержит (элемент. userId)) как ни странно, я просматриваю первую запись, но затем я получаю ту же ошибку, что и выше, во второй записи. Что может быть причиной этого? Просто сводит меня с ума. Спасибо за помощь

Ответ №1:

Возможно, очистка вашего кода помогла бы?

 public void UpdateManagerList() {
    var member = GetUserMember();

    var managerList = db.UserList.Where(u => u.Name == "Managers" amp;amp; u.OrgId == member.OrgId).FirstOrDefault();
    var listId = managerList.O_UserListId;

    // list and user ids for up to date managers.
    List<O_Member> ManagersCur = db.O_MemberWhere(u => u.OrgId == member.OrgId amp;amp; u.Manage == true amp;amp; u.JoinedStored == true).ToList();
    List<string> curUserIds = ManagersCur.Select(u => u.UserId).ToList();

    //list of managers stored in userlist
    List<UserListItem> ManagersList = db.UserListItem.Where(u => u.UserListId == listId).ToList();
    List<string> listUserIds = ManagersList.Select(u => u.UserId).ToList();

    foreach (var curMgrId in curUserIds) {
        if (!listUserIds.Contains(curMgrId)) {
            var newUserLI = new UserListItem();
            newUserLI.UserListId = listId;
            newUserLI.UserId = curMgrId;
            db.UserListItem.Add(newUserLI);
            db.SaveChanges();
        }
    }