【问题标题】:Is there a way to get entity id-field's name by reflection or whatever?有没有办法通过反射或其他方式获取实体 id-field 的名称?
【发布时间】:2009-07-03 01:51:30
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:
    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;
    }
    

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

    【讨论】:

      【解决方案2】:

      如果您可以获得实体的 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>();
      }
      

      【讨论】:

        【解决方案3】:

        Entity Framework 支持论坛中的 post 展示了如何使用反射来查找 ID 字段及其详细信息。

        【讨论】:

          【解决方案4】:

          Entity 类仍然是一个继承自 System.Data.Objects.DataClasses.EntityObject 的类,所以,我认为反射仍然可以处理它。

          你试过了吗?你有什么错误吗?

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-03-04
            • 2010-10-19
            • 2011-02-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多