从EF Core上下文获取类型

时间:2019-05-25 01:19:19

标签: c# entity-framework-core

我正在尝试从给定的字符串中获取实体的type。我的最终目标是为用户创建一个界面(UI界面),使其具有GUI来浏览我的数据库。它们基本上都有一棵表和它们的字段的树,并且在选择字段时,我想在后端建立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 个答案:

答案 0 :(得分:2)

基本上,您需要了解实体类 namespace ,因为名称本身不足以唯一地标识实体类型。

一旦知道,就可以像第一次尝试一样,使用FindEntityType方法获得该实体的EF Core元数据:

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

如果不存在这样的实体,则该方法的结果为null,否则为IEntityType实例。它可用于获取与实体相关的其他EF Core元数据,例如属性,导航,表名称等。ClrType属性提供所需的关联类的类型:

var classType = entityType.ClrType;