如何从Entity Framework Core中的DbContext获取列名和相应的数据库类型

Ham*_*thi 7 c# entity-framework entity-framework-core .net-core

假设我有这个表:

在此输入图像描述

如何从DbContextEntity Framework Core中获取列名和数据库数据类型?

提示

  1. 名为clg#的列由EF Core Scaffold工具转换为clg1,因此我需要真正的列名而不是当前的EF名称

  2. 我需要数据库类型,而不是clrType,当然必须是跨平台.也许我会改变数据库,所以方法也必须工作.

期望的结果:

    <D.clg#, int>
    <D.clgname, nvarchar(50)>
    <D.city, nvarchar(50)>
    <D.pname, nvarchar(50)>
Run Code Online (Sandbox Code Playgroud)

有人能提供解决方案吗?

Iva*_*oev 23

更新:从EF Core 2.0开始,事情发生了变化,因此原始答案不再适用.现在EF Core为每种数据库类型构建单独的模型,因此代码更简单并直接使用Relational()扩展:

var entityType = dbContext.Model.FindEntityType(clrEntityType);

// Table info 
var tableName = entityType.GetTableName();
var tableSchema = entityType.GetSchema();

// Column info 
foreach (var property in entityType.GetProperties())
{
    var columnName = property.GetColumnName();
    var columnType = property.GetColumnType();
};
Run Code Online (Sandbox Code Playgroud)

原始答案(EF Core 1.x):

获取访问相关的元数据是EF核心相比,EF容易得多-你从开始Get属性来获取Set,使用Relational()DbContext.Model获得IModel,那么GetEntityTypes还是FindEntityTypeIEntityType

但问题是EF Core允许您对不同的目标数据库使用不同的设置.为了获取与上下文使用的当前数据库相对应的属性,您需要访问GetProperties和使用FindPropertyIProperty属性以获取所需的信息.

这是一个例子:

var entityType = dbContext.Model.FindEntityType(clrEntityType);

// Table info 
var tableName = entityType.Relational().TableName;
var tableSchema = entityType.Relational().Schema;

// Column info 
foreach (var property in entityType.GetProperties())
{
    var columnName = property.Relational().ColumnName;
    var columnType = property.Relational().ColumnType;
};
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,所有这些都需要通过EF Core源进行搜索,因为它没有记录.因此,(1)我不知道,现在,我希望与上面得到它,但正如你所说,显然它需要其他的东西(2)最终`dbContext.Database.GetDbConnection().Database`(3)唐不知道,最终从`relationalDbServices.InvariantName`派生出来 (2认同)
  • 这不再适用于EF Core 2,但/sf/answers/3197047171/ (2认同)

Yas*_*osh 13

对于 EF Core 5,您需要使用接受 StoreObjectIdentifier 的重载:GetColumnName(IProperty, StoreObjectIdentifier)。

EF 5 更新:

var entityType = dbContext.Model.FindEntityType(clrEntityType); 
var schema = entityType.GetSchema();
var tableName = entityType.GetTableName();
var storeObjectIdentifier = StoreObjectIdentifier.Table(tableName, schema);
var columnName = entityType.FindProperty(propertyName).GetColumnName(storeObjectIdentifier);
Run Code Online (Sandbox Code Playgroud)