Ham*_*thi 7 c# entity-framework entity-framework-core .net-core
假设我有这个表:
如何从DbContextEntity Framework Core中获取列名和数据库数据类型?
提示
名为clg#的列由EF Core Scaffold工具转换为clg1,因此我需要真正的列名而不是当前的EF名称
我需要数据库类型,而不是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还是FindEntityType让IEntityType等
但问题是EF Core允许您对不同的目标数据库使用不同的设置.为了获取与上下文使用的当前数据库相对应的属性,您需要访问GetProperties和使用FindProperty和IProperty属性以获取所需的信息.
这是一个例子:
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)
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)