Argument.NullException при работе со свойствами навигации в Entity Framework - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь вернуть список со всеми друзьями в чате.Чат Друзья означает все идентификаторы пользователей, где в сообщениях я - Отправитель или Получатель. Вот мой код:

public List<string> GetUserMessagesGrouped(string userId)
    {
        var a = _context.Users.FirstOrDefault(x => x.Id == userId).SentMessages.Select(m => m.ReceiverID);
        var b = _context.Users.FirstOrDefault(y => y.Id == userId).ReceivedMessages.Select(m => m.SenderID);

        var ChatBuddies = a.Concat(b).Distinct();
        return  ChatBuddies.ToList();
    }

Проблема: Я получаю это исключение. System.1015 *

enter image description here

Точки крепления

var user = _context.Users.Include("ReceivedMessages").Include("SentMessages").FirstOrDefault(x => x.Id == userId);
        var received = user.ReceivedMessages.Select(r => r.SenderID).ToList();
        var sender = _context.Messages.Where(m => m.SenderID == userId).Select(s => s.ReceiverID).ToList();

        var ChatBuddies = received.Union(sender).ToList();

        return ChatBuddies;

Ключ использовался .Include("ReceivedMessages").Include("SentMessages")так что они не были null.

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Вам необходимо проверить документацию для FirstOrDefault() - в частности, проверить, что возвращается, когда возвращается значение по умолчанию .

Возможно, вы захотите использовать оператор Элвиса ?. как способ избежать вашего исключения нулевой ссылки.

0 голосов
/ 22 мая 2018

Поместите точку останова, где вызывается метод, и проверьте значение userId.Это говорит нулевые аргументы, которые могут быть вызваны нулевым аргументом, данным методу.

Кроме того, вы можете просто создать тестовую переменную, подобную этой:

var userIdTest = userId; 

И поместить точку останова, чтобы проверить, действительно ли она попадает в метод, как определено, также установив значение по умолчанию:

public List<string> GetUserMessagesGrouped(string userId = ""){}

Следует предотвратить это исключение.Вы также можете использовать блок try catch для стека трассировки его к источнику.

try{ method body }
catch(ArgumentNullException exception){
   Console.WriteLine(ex); 
}

Вы можете просто поставить точку останова в ключевом слове catch вместо Console Logging it.Я надеюсь, что смогу помочь и удачи!

...