Если кто-то еще смотрит, вот как я это сделал.Это метод расширения для DBContext, который принимает тип и возвращает имена физических столбцов и их свойства.
Этот метод использует контекст объекта для получения списка физических столбцов, а затем использует свойство метаданных «PreferredName» для сопоставления каждого столбца.его свойство.
Поскольку он использует контекст объекта, он инициирует соединение с базой данных, поэтому первый запуск будет медленным в зависимости от сложности контекста.
public static IDictionary<String, PropertyInfo> GetTableColumns(this DbContext ctx, Type entityType)
{
ObjectContext octx = (ctx as IObjectContextAdapter).ObjectContext;
EntityType storageEntityType = octx.MetadataWorkspace.GetItems(DataSpace.SSpace)
.Where(x => x.BuiltInTypeKind == BuiltInTypeKind.EntityType).OfType<EntityType>()
.Single(x => x.Name == entityType.Name);
var columnNames = storageEntityType.Properties.ToDictionary(x => x.Name,
y => y.MetadataProperties.FirstOrDefault(x => x.Name == "PreferredName")?.Value as string ?? y.Name);
return storageEntityType.Properties.Select((elm, index) =>
new {elm.Name, Property = entityType.GetProperty(columnNames[elm.Name])})
.ToDictionary(x => x.Name, x => x.Property);
}
Чтобы использовать его, простосоздать вспомогательный статический класс и добавить вышеуказанную функцию;тогда это так же просто, как звонить
var tabCols = context.GetTableColumns(typeof(EntityType));