EF Lazy Загрузка, извлечение запроса в другой метод приводит к нулевому значению для свойства навигации - PullRequest
0 голосов
/ 31 августа 2018

Я использую Entity Framework и имею модель, к которой применяются листинги контроля доступа. У меня есть отношения «один ко многим» между моей моделью и моделью ACL.

В большинстве случаев, когда мне нужно запросить мою модель, мне нужно только вернуть модели с соответствующим ACL.

Вот пример:

var myUnits = _context.Units
    .Include(unit => unit.AccessControlRules)
    .Where(unit => unit.AccessControlRules.FirstOrDefault(acl => acl.UserId == 15) != null);

Это работает правильно каждый раз. Он вернет только те единицы, которые имеют acl для пользователя с идентификатором 15.

Однако, когда я извлекаю это в следующую форму, он выбрасывает значение не может быть пустым исключением, потому что unit.AccessControlRules имеет значение null.

    var myUnits = _context.Units
    .Include(unit => unit.AccessControlRules)
    .Where(unit => permissionCheck(unit));

    private bool permissionCheck(Unit unit)
    {
        return unit.AccessControlRules.FirstOrDefault(acl => acl.UserId == 15) != null;
    }

Это точно такой же код, тогда как вторая (нерабочая) версия unit.AccessControlRules == null.

Может ли кто-нибудь объяснить это поведение?

1 Ответ

0 голосов
/ 31 августа 2018

Я предполагаю, что в методеmissionCheck дочерние объекты еще не были загружены из-за того, что EF не знает, как создать соответствующий SQL-запрос для функции (или что-то в этом роде).

Вы можете сделать это, добавив .AsEnumerable() после Include и до Where НО, это будет означать, что вы загружаете ВСЕ объекты Unit и Rule из БД в память, прежде чем применять оператор where и т. д., вероятно, будут использовать больше памяти и времени - и, следовательно, вероятно, не будут эффективным способом запрашивать информацию.

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