The way of getting actual table name
For example, if you have DbContext object like this (C#):
public class MyDbContext : DbContext {
public DbSet<FooBar> FooBars { get; set; }
}
...
var dbContext = new MyDbContext();
You can obtain the actual table name of the DbSet property from the DbContext instance with the following code.
// DbContext knows everything about the model.
var model = dbContext.Model;
// Get all the entity types information contained in the DbContext class, ...
var entityTypes = model.GetEntityTypes();
// ... and get one by entity type information of "FooBars" DbSet property.
var entityTypeOfFooBar = entityTypes.First(t => t.ClrType == typeof(FooBar));
// The entity type information has the actual table name as an annotation!
var tableNameAnnotation = entityTypeOfFooBar.GetAnnotation("Relational:TableName");
var tableNameOfFooBarSet = tableNameAnnotation.Value.ToString();
Package as an extension method
By the way, we can get a DbContext from a DbSet.
See also: "How to get a DbContext from a DbSet in EntityFramework Core 2.0."
Therefore, you can package the above code as an extension method like this C# code:
using System;
using System.Linq;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
// Prerequire: You have to install DbContextGetter class in this project.
// https://dev.to/j_sakamoto/how-to-get-a-dbcontext-from-a-dbset-in-entityframework-core-c6m
public static class TableNameOfDbSetGetter
{
public static string GetTableName<T>(this DbSet<T> dbSet) where T: class
{
var dbContext = dbSet.GetDbContext();
var model = dbContext.Model;
var entityTypes = model.GetEntityTypes();
var entityType = entityTypes.First(t => t.ClrType == typeof(T));
var tableNameAnnotation = entityType.GetAnnotation("Relational:TableName");
var tableName = tableNameAnnotation.Value.ToString();
return tableName;
}
}
// How to use:
//
// class MyDbContext : DbContext {
// public DbSet<FooBar> FooBars { get; set; }
// }
// ...
// var myContext = new MyDbContext();
// var tableName = myContext.FooBars.GetTableName();
// ~~~~~~~~~~~~~~
// tableName; // -> "FooBars"
This code works fine even if the entity class is decorated with [TableAttribute("TableName")]
.
Happy coding :)
Top comments (1)
Actually, you already know a table name :)
// var tableName = myContext.FooBars.GetTableName();
// ~~~~~~~~~~~~~~
// tableName; // -> "FooBars"