Today I had a question show up in my inbox about finding the key properties of a given entity type. Searching around I didn’t find a good existing post about this, so here is the code you need. The code provides a couple of simple extension methods to DbContext.
Note that the code is somewhat ugly for a fairly simple task… our team knows that and in EF7 things will be a LOT more straightforward.
using System; using System.Data.Entity; using System.Data.Entity.Core.Metadata.Edm; using System.Data.Entity.Infrastructure; using System.Linq; namespace System.Data.Entity { public static class DbContextExtensions { public static string[] GetKeyNames<TEntity>(this DbContext context) where TEntity : class { return context.GetKeyNames(typeof(TEntity)); } public static string[] GetKeyNames(this DbContext context, Type entityType) { var metadata = ((IObjectContextAdapter)context).ObjectContext.MetadataWorkspace; // Get the mapping between CLR types and metadata OSpace var objectItemCollection = ((ObjectItemCollection)metadata.GetItemCollection(DataSpace.OSpace)); // Get metadata for given CLR type var entityMetadata = metadata .GetItems<EntityType>(DataSpace.OSpace) .Single(e => objectItemCollection.GetClrType(e) == entityType); return entityMetadata.KeyProperties.Select(p => p.Name).ToArray(); } } }