And*_*rus 5 c# database-metadata entity-framework-core asp.net-core-mvc
使用 EF Core 的 ASP.NET Core MVC 应用程序。在 Linq to SQL 中,此代码返回数据库表主键列名称的列表:
/// <summary>
/// Database primary key names
/// </summary>
public IList<string> DatabasePrimaryKey(Type dbContextPocoType)
{
List<string> pk = new List<string>();
foreach (PropertyInfo p in dbContextPocoType.GetProperties())
{
var ca = p.GetCustomAttributes(typeof(ColumnAttribute), true);
if (ca.Length == 0) continue;
var atr = (ColumnAttribute)ca.Single();
if (!atr.IsPrimaryKey) continue;
pk.Add(atr.Name);
}
return pk;
}
Run Code Online (Sandbox Code Playgroud)
在 EF Core 中我尝试过
var entry = ctx.Entry(dbContextPocoType);
var primaryKey = entry.Metadata.FindPrimaryKey();
IList<string> keys = primaryKey.Properties.Select(x => x.Name).ToList();
return keys;
Run Code Online (Sandbox Code Playgroud)
但这会返回 C# 属性名称 - 如何在 EF Core 中获取数据库表列名称?
更新:使用答案我创建了这个方法:
public IList<string> DatabasePrimaryKey<TPoco>()
{
var entry = ctx.Entry(typeof(TPoco));
var primaryKey = entry.Metadata.FindPrimaryKey();
var entityType = ctx.Model.FindEntityType(typeof(TPoco).Name);
var schema = entityType.GetSchema();
var tableName = entityType.GetTableName();
IList<string> keys = primaryKey.Properties
.Select(x => x.GetColumnName(StoreObjectIdentifier.Table(tableName, schema)))
.ToList();
return keys;
}
Run Code Online (Sandbox Code Playgroud)
这个方法可以改进吗?
dgl*_*ano 12
在 EF Core 3.x 中,您可以尝试使用IProperty扩展方法GetColumnName。
var entry = ctx.Entry(dbContextPocoType);
var primaryKey = entry.Metadata.FindPrimaryKey();
var primaryKeyColumns = primaryKey.Properties
.Select(property => property.GetColumnName())
.ToList()
return primaryKeyColumns;
Run Code Online (Sandbox Code Playgroud)
StoreObjectIdentifier对于 EF Core 5,您需要使用接受:的重载GetColumnName(IProperty, StoreObjectIdentifier)。
EF 5 更新:
public IList<string> DatabasePrimaryKey<TPoco>()
{
var entityType = ctx.Model.FindEntityType(typeof(TPoco));
var primaryKey = entityType.FindPrimaryKey();
var schema = entityType.GetSchema();
var tableName = entityType.GetTableName();
var storeObjectIdentifier = StoreObjectIdentifier.Table(tableName, schema);
IList<string> primaryKeyColumns = primaryKey.Properties
.Select(x => x.GetColumnName(storeObjectIdentifier))
.ToList();
return primaryKeyColumns;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3610 次 |
| 最近记录: |