有没有办法让通过反射或任何实体ID字段的名字?(Is there a way to get enti

2019-07-29 13:56发布

我试图让一个实体的ID字段名(属性名),这可能吗?

用户的用户=新用户(); //用户是一个实体

串idField = ??????? //user.UserId

Answer 1:

如果你能得到的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>();
}


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

你可以既funcs中合并成一个或设置搜索条件。



Answer 3:

这个帖子在实体框架支持论坛展示了如何使用反射来找到ID字段和他们的详细资料。



Answer 4:

实体类还是从System.Data.Objects.DataClasses.EntityObject继承的类,所以,我认为反思仍然在它的工作。

你试过了吗? 你得到任何错误?



文章来源: Is there a way to get entity id-field's name by reflection or whatever?