Получить тип из основного контекста EF - PullRequest
1 голос
/ 25 мая 2019

Я пытаюсь получить type сущности из заданной строки. Моя конечная цель - создать интерфейс (интерфейс пользовательского интерфейса) для пользователей, чтобы иметь графический интерфейс для изучения моей базы данных. В основном у них есть дерево таблиц и их полей, и когда они выбирают поля, я хочу создать SQL-запрос на бэкэнде и вернуть данные. Я застрял на том, как получить Type.

Я пытаюсь сшить решение между этими нитями:

Вот мои текущие попытки:

var type1 = _dbContext.Model.FindEntityType("Chadwick.Database.Entities.Appearances");
var type = _dbContext.Appearances.GetType();
var context = _dbContext.Set(typeof(Appearance)); // this works. I just need to pass in a variable instead of the actual type
var stuff = await context.FromSql("SELECT TOP 100 * FROM Appearances").ToListAsync();
// var data = await _dbContext.Appearances.Select(a => new {a.PlayerId}).Take(100).ToListAsync();
return new OkObjectResult(stuff);

По сути, я никогда не узнаю, что они после "Появлений", поэтому я не могу просто указать точный тип, мне нужно получить его (по строке) из контекста.

Есть ли способ получить фактический тип по строке?

Я знаю, что мог бы сделать что-то подобное, но это выглядит избыточно (около 20 таблиц и будет больше)

public Type GetTypeByName(string name)
{
    switch (name)
    {
        case "Appearances":
            return typeof(Appearance);
        case "AwardsManagers":
            return typeof(AwardsManager);
    }

    return null;
}

1 Ответ

2 голосов
/ 26 мая 2019

В основном вам нужно знать класс сущностей пространство имен , потому что само имя недостаточно для однозначной идентификации типа сущности.

Как только вы это узнаете, вы можете получить метаданные EF Core для этого объекта, используя метод FindEntityType, как в первой попытке:

var entityType = _dbContext.Model.FindEntityType("Chadwick.Database.Entities." + className);

Результатом этого метода будет null, если такой сущности не существует, IEntityType, в противном случае. Его можно использовать для получения других метаданных EF Core, связанных с сущностью, таких как свойства, навигация, имя таблицы и т. Д. А необходимый тип связанного класса предоставляется свойством ClrType:

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