Доступ к свойствам внешнего ключа из IQueryable <T>в Entity Framework Core 3.1 - PullRequest
1 голос
/ 28 марта 2020

Я пишу метод расширения IQueryable<T> и хотел бы получить внешние ключи свойств навигации T. Я понял, что могу получить к ним доступ через IModel.FindEntityType(T).GetNavigations(), вопрос в том, как лучше всего получить доступ к IModel, сохраняя метод максимально простым.

В данный момент метод выглядит что-то вроде этого:

public static IQueryable<TQuery> DoMagic<TQuery>(this IQueryable<TQuery> query, IModel model)
{
    var entity = model.FindEntityType(entityType);
    var navigationProperties = entity.GetNavigations();

    ...
}

Мне бы очень хотелось, если бы мне не нужно было передавать IModel в качестве аргумента, подобного этому:

public static IQueryable<TQuery> DoMagic<TQuery>(this IQueryable<TQuery> query)
{
    var entity = Model.FindEntityType(entityType);
    var navigationProperties = entity.GetNavigations();

    ...
}

Я рассмотрел вопрос о добавлении IServiceCollection метода расширения и передачи DbContext и установки IModel в качестве свойства stati c в метод расширения IQueryable<T>. Проблема в том, что он ограничивает меня одним DbContext.

. Я также искал возможность добавить метод расширения к DbContextOptionsBuilder, но не нашел лучшего способа добиться того, что Я хочу сделать так.

Может быть, есть другие способы получить доступ к внешним ключам? Любая помощь приветствуется!

Редактировать

Из свойств навигации я хочу получить доступ к свойству ForeignKey, чтобы узнать, какое свойство используется для разрешения свойства навигации , Что-то вроде:

navigationProperties.ToList().Select(x => x.ForeignKey);

1 Ответ

1 голос
/ 28 марта 2020

Один из способов получить свойства навигации:

public static IQueryable<TQuery> DoMagic<TQuery>(this IQueryable<TQuery> query)
{
    var navigationProperties = typeof(TQuery).GetProperties()
        .Where(p => (typeof(IEnumerable).IsAssignableFrom(p.PropertyType) && p.PropertyType != typeof(string)))
        .ToArray();

    ...
}

ОБНОВЛЕНИЕ: Попытка получить DbContext со свойством Model из IQueryable приведет к некоторому не симпатичному коду, эта ссылка показывает как это можно сделать:

. Net EF Core 2.1 Получить DbContext из аргумента IQueryable

Если вы используете внедрение зависимостей, вы можете поместить экземпляр DbContext в контейнер в области действия веб-запроса или операции и вставьте его в класс с помощью метода DoMagic.

Другой способ - добавить метод к потомку класса DbContext, затем Параметр модели не понадобится.

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