Is there a way to get entity id-field's name by reflection or whatever?

回眸只為那壹抹淺笑 提交于 2019-12-06 13:58:45

问题


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


回答1:


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>();
}



回答2:


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.




回答3:


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




回答4:


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?



来源:https://stackoverflow.com/questions/1077497/is-there-a-way-to-get-entity-id-fields-name-by-reflection-or-whatever

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!