有没有办法通过反射或其他方式获取实体id-field的名称?

时间:2009-07-03 01:51:30

标签: c# .net entity-framework reflection propertyinfo

我正在尝试获取实体的ID字段名称(属性名称),是否可能?

用户user = new User(); //用户是实体

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

4 个答案:

答案 0 :(得分:5)

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

您可以将两个func合并为一个或设置搜索条件。

答案 1 :(得分:3)

如果您可以获取实体的EntitySet或EntityType,那么您可以使用KeyMembers属性:

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
}

您可以从上下文中获取通用对象集:

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

答案 2 :(得分:1)

实体框架支持论坛中的这个post显示了如何使用反射来查找ID字段及其详细信息。

答案 3 :(得分:0)

实体类仍然是一个继承自System.Data.Objects.DataClasses.EntityObject的类,因此,我认为反射仍然适用于它。

你试过吗?你有任何错误吗?