如何根据表名在DbContext中选择正确的DbSet

Dob*_*leA 9 c# linq reflection entity-framework

假设我有一个带有以下DbSet的DbContext

class Amimals : DbContext
{
    public DbSet<Dog> Dogs { get; set; }
    public DbSet<Cat> Cats { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在每个EntityTypeConfiguration内部,我为每个DbSet定义表

class DogConfig : EntityTypeConfiguration
{
    public  DogConfig()
    {
        this.ToTable("DOG_TABLE");
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我有表名和DbContext,我怎样才能获取并使用正确的DbSet?

void foo()
{
    string tableName = this.GetTableName();
    using(Animals context = new Animals())
    {
        /* Made up solution */
        DbSet animalContext = context.Where(c => c.TableName == tableName);
        ...
        /* Do something with DbSet */
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

Vik*_*tev 18

您可以Type使用该方法从DbContext获取DbSet DbContext.Set(Type entityType).因此,如果您将模型类名称作为字符串,则应该对实际clr类型进行一些映射.

例如:

string tableName = "Cat";
var type = Assembly.GetExecutingAssembly()
        .GetTypes()
        .FirstOrDefault(t => t.Name == tableName);

if(type != null)
    DbSet catContext = context.Set(type);
Run Code Online (Sandbox Code Playgroud)

你也可以使用Full Assembly Qualified Name Type.GetType('...')从字符串中获取类型

如果您可以通过某种方式以通用方式存储配置并使用通用context.Set<T>()方法,那将更加容易 .

  • 旁注:虽然这种方法在Entity Framework上运作良好,但在** Entity Framework Core **上却无法使用。**对于EF Core **,我发现[此方法](/sf/answers/3637118411/)非常有用。希望其他人也能找到此评论有用! (2认同)