Question

I am trying to get the ID field name (property name) of an entity, is it possible?

User user= new User(); //User is an Entity

string idField = ??????? //user.UserId

Was it helpful?

Solution

If you can get the EntitySet, or the EntityType, for the entity, then you can use the KeyMembers property:

public IEnumerable<string> GetIdProperties(EntitySetBase entitySet)
{
  return GetIdProperties(entitySet.ElementType);
}

public IEnumerable<string> GetIdProperties(EntityTypeBase entityType)
{
  return from keyMember in entityType.KeyMembers
         select keyMember.Name
}

You can obtain a generic object set from the context:

public ObjectSet<TEntity> GetEntitySet<TEntity>(ObjectContext context)
{
    return context.CreateObjectSet<TEntity>();
}

OTHER TIPS

public static IEnumerable<string> GetIdFields<TEntity>() where TEntity
  : EntityObject
{
    var ids = from p in typeof(TEntity).GetProperties()
              where (from a in p.GetCustomAttributes(false)
                     where a is EdmScalarPropertyAttribute &&
                       ((EdmScalarPropertyAttribute)a).EntityKeyProperty
                     select true).FirstOrDefault()
              select p.Name;
    return ids;
}

public static string GetIdField<TEntity>() where TEntity : EntityObject
{
    IEnumerable<string> ids = GetIdFields<TEntity>();
    string id = ids.Where(s => s.Trim().StartsWith(typeof(TEntity).Name.
                  Trim())).FirstOrDefault();
    if (string.IsNullOrEmpty(id)) id = ids.First();
    return id;
}

You could merge both funcs into one or set your search conditions.

This post in the Entity Framework support forums shows how to use reflection to find ID fields and their details.

Entity class is still a class which inherits from System.Data.Objects.DataClasses.EntityObject, so, i think reflection will still work on it.

Have you tried it? Do you get any error?

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top