Правильный способ сделать это - использовать метод GetTableName
со следующей страницы: http://romiller.com/2014/04/08/ef6-1-mapping-between-types-tables/
Сюда входит поддержка мета-тега и изменений в конструкторе моделей .ToTable()
.Примеры на этой странице в основном возвращают имя свойства DbSet
, которое не обязательно является именем таблицы в базе данных.
Например, если у вас было:
DbSet<Config> Settings { get; set; }
Код на этой страницебудет возвращать «Настройки» для имени таблицы, когда фактическое имя таблицы БД - «Конфиги».И у вас возникли бы те же проблемы, если бы вы использовали:
modelBuilder.Entity<Config>().ToTable("UserSettings")
Использование кода в приведенной ссылке облегчает все эти проблемы.Здесь это написано как расширение:
public static class DbContextExtensions
{
public static string GetTableName<T>(this DbContext context) where T : class
{
var type = typeof(T);
var metadata = ((IObjectContextAdapter)context).ObjectContext.MetadataWorkspace;
// Get the part of the model that contains info about the actual CLR types
var objectItemCollection = ((ObjectItemCollection)metadata.GetItemCollection(DataSpace.OSpace));
// Get the entity type from the model that maps to the CLR type
var entityType = metadata
.GetItems<EntityType>(DataSpace.OSpace)
.Single(e => objectItemCollection.GetClrType(e) == type);
// Get the entity set that uses this entity type
var entitySet = metadata
.GetItems<EntityContainer>(DataSpace.CSpace)
.Single()
.EntitySets
.Single(s => s.ElementType.Name == entityType.Name);
// Find the mapping between conceptual and storage model for this entity set
var mapping = metadata.GetItems<EntityContainerMapping>(DataSpace.CSSpace)
.Single()
.EntitySetMappings
.Single(s => s.EntitySet == entitySet);
// Find the storage entity set (table) that the entity is mapped
var table = mapping
.EntityTypeMappings.Single()
.Fragments.Single()
.StoreEntitySet;
// Return the table name from the storage entity set
return (string)table.MetadataProperties["Table"].Value ?? table.Name;
}
}