Динамически получить DbSet <T>по имени класса Entity - EF Core - PullRequest
0 голосов
/ 24 февраля 2020

Об этом уже спрашивали и отвечали, но для. Net Framework. Я изо всех сил пытаюсь достичь той же функциональности в. Net Core.

У меня есть метод, который получает имя объекта в виде строки (вместе с некоторыми критериями выбора). Я хочу получить тип Entity, используя строку entityName и запросить EF.

В предыдущем ответе с использованием EF 6 было предложено следующее

public async Task<bool> MyMethod(string _type)
{
    Type type = Type.GetType(_type);

    var tableSet = _context.Set(type);

    var list = await db.ToListAsync();

    // do something
}

// pass the full namespace of class
var result = await MyMethod("Namespace.Models.MyClass")

К сожалению context.Set больше не принимает параметр, так что это не не возможно.

Я пробовал несколько способов получить и использовать тип с контекстом, но я бью кирпичную стену. Я дам здесь тестовый код - но ничего из этого не достигает того, чего я хочу.

public IList LoadByKey(string entityName, params string[] parameters)
{
    // Get type from entity name string - Include assembly
    Type clType = Type.GetType($"{entityName},Savant.Pulse.Testbeds.ReferenceData.DB");

    // Create instance using the type retrieved from GetType, still just an Object
    var instantiatedObject = Activator.CreateInstance(clType);

    // Get the entity type from the context itself.  This does return the correct type.
    // So I thought I was heading in the correct direction.
    var entityType = _context.Model.FindEntityType(entityName);

    // Get a DbSet of the correct type.  Once again this does return what you think you'd need. 
    // But it's an Object? type returned.  I can't seem to cast it to the correct type from the entityName. 
    var dbSet = _context.GetType().GetProperty(entityType.ClrType.Name).GetValue(_context);

    throw new System.NotImplementedException();
}
...