Entity Framework Core: внешний ключ был установлен и вызывается как ноль - PullRequest
0 голосов
/ 14 апреля 2020

Я начинаю с генерации токена refre sh и сохранения его на SQL сервере через Entity Framework Core следующим образом:

var refreshToken = new RefreshToken { User = user, Token = Guid.NewGuid().ToString() };
_context.RefreshTokens.Add(refreshToken);
_context.SaveChanges();

_context наследуется от Microsoft.EntityFrameworkCore.DbContext.

На данный момент _context.RefreshTokens.ToList(); содержит один предмет. Id, Token и User не равны NULL, и я могу получить доступ к данным в User.

Вызывается другая конечная точка API, и внутри я получаю список RefreshTokens следующим образом

var l = _context.RefreshTokens.ToList();

l.Id заполнено, l.Token заполнено, l.User пусто.

Это создает проблему, потому что мне нужен доступ к пользователю, связанному с RefreshToken

Я пытался получить _context.Users.ToList();, и пользователь, который был установлен ранее, присутствует в этом списке.

Мое первоначальное предположение было, что EF может не запрашивать user, пока это не понадобится, поэтому я попытался получить l.User.Id из приведенного выше фрагмента, но он выдает следующие ошибки:

System.NullReferenceException: для ссылки на объект не задан экземпляр объекта

Почему поле в сущности, которое я только что сохранил, null при его вызове?

Ответы [ 2 ]

0 голосов
/ 14 апреля 2020

l.Id заполнен, l.Token заполнен, l.User нулевой.

l.Id, вероятно (вы не удосужились дать нам определения объекта) Int или что-то. l.Token - это Guid, поэтому другой примитивный тип.

l. User - это объект. Ссылочные объекты не загружаются, если они не включены (через .Include) в запрос. Подумайте об этом - если все ссылочные объекты будут автоматически загружены, то вы ВСЕГДА загрузите ВСЕ ССЫЛКИ - что приводит к «всей базе данных». Это ваша работа. Включить то, что вы хотите включить.

_context.RefreshTokens.Include (x => x.User) .ToList ()

сообщает EfCore, что включены другие объекты, которые вы хотите получить. Вы можете использовать несколько включений и включает в себя несколько уровней глубоко. Вскоре (EfCore 5.0) с расширениями, которые вы загружаете из Nuget от третьих лиц, вы также можете отфильтровать то, что загружается через include.

0 голосов
/ 14 апреля 2020

Используйте метод включения.

_context.RefreshTokens.Include(t => t.User).ToList();

для получения дополнительной информации -> https://docs.microsoft.com/en-us/ef/core/querying/related-data

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