如何根据表名在DbContext中选择正确的DbSet
本文关键字:选择 DbSet DbContext 何根 | 更新日期: 2023-09-27 18:26:14
假设我有一个具有以下DbSets 的DbContext
class Amimals : DbContext
{
public DbSet<Dog> Dogs { get; set; }
public DbSet<Cat> Cats { get; set; }
}
在每个EntityTypeConfiguration内部,我正在为每个类似的DbSet定义表
class DogConfig : EntityTypeConfiguration
{
public DogConfig()
{
this.ToTable("DOG_TABLE");
...
}
}
现在,如果我有表名和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 */
...
}
}
您可以通过Type
使用方法DbContext.Set(Type entityType)
从DbContext获取DbSet。因此,如果您将模型类名作为字符串,则应该映射到实际的clr类型。
例如:
string tableName = "Cat";
var type = Assembly.GetExecutingAssembly()
.GetTypes()
.FirstOrDefault(t => t.Name == tableName);
DbSet catContent;
if(type != null)
catContent = context.Set(type);
您也可以使用Full Assembly Qualified Name type.GetType("…")从字符串中获取类型
如果您能够以通用的方式存储配置并使用通用的context.Set<T>()
方法,那么If将更容易。
下面是另一种方法,对我来说很好:
Type t = Type.GetType(Assembly.GetExecutingAssembly().GetName().Name + "." + "TableName");
DbSet dbset = dbcontext.Set(t);
在DotNetCore中,我做了这样的事情。在这种情况下,最好使用白名单来确保某人不会要求一个不受欢迎的实体。
[HttpGet]
[Route("entities/{entityName}")]
public IActionResult GetEntities(string entityName)
{
var name = Assembly.GetExecutingAssembly().GetName().Name + ".path.to.your.entity." + entityName;
Type entityType = Type.GetType(name);
var results = _myContext
.GetType()
.GetMethod("Set")
.MakeGenericMethod(entityType)
.Invoke(_myContext, null);
return Ok(results);
}