Reputation: 334
Say I have a DbContext with the following DbSets
class Amimals : DbContext
{
public DbSet<Dog> Dogs { get; set; }
public DbSet<Cat> Cats { get; set; }
}
Inside of each EntityTypeConfiguration I am defining the table for each DbSet like
class DogConfig : EntityTypeConfiguration
{
public DogConfig()
{
this.ToTable("DOG_TABLE");
...
}
}
Now, if I have the table name and the DbContext, how can I grab and use the correct 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 */
...
}
}
Upvotes: 17
Views: 24693
Reputation: 4908
You can get DbSet from DbContext by Type
using the method DbContext.Set(Type entityType)
. So if you have the model class name as string you should do some mapping to actual clr type.
For example:
string tableName = "Cat";
var type = Assembly.GetExecutingAssembly()
.GetTypes()
.FirstOrDefault(t => t.Name == tableName);
DbSet catContent;
if(type != null)
catContent = context.Set(type);
You also can get type from string using Full Assembly Qualified Name Type.GetType(' ... ')
If will be even easier if you can store configurations somehow in generic way and use the generic context.Set<T>()
method.
Upvotes: 26
Reputation: 1358
In DotNetCore I did something like this. In this case it would probably be good to use a whitelist to make sure someone doesn't ask for an undesirable entity.
[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);
}
Upvotes: 0
Reputation: 3469
Another approach is below and work fine for me:
Type t = Type.GetType(Assembly.GetExecutingAssembly().GetName().Name + "." + "TableName");
DbSet dbset = dbcontext.Set(t);
Upvotes: 2