ASP.NET Core MVC application using EF Core. In Linq to SQL, this code returns list of database table primary key columns names:
/// <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;
}
In EF Core I tried
var entry = ctx.Entry(dbContextPocoType);
var primaryKey = entry.Metadata.FindPrimaryKey();
IList<string> keys = primaryKey.Properties.Select(x => x.Name).ToList();
return keys;
But this returns C# property names - how to get database table column names in EF Core?
Update: using answer I created this method:
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;
}
Can this method be improved?