我正在尝试获取实体的 ID 字段名称(属性名称),这可能吗?
用户用户=新用户();//用户是一个实体
字符串 idField = ??????? //user.UserId
我正在尝试获取实体的 ID 字段名称(属性名称),这可能吗?
用户用户=新用户();//用户是一个实体
字符串 idField = ??????? //user.UserId
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;
}
您可以将两个功能合并为一个或设置您的搜索条件。
如果您可以获得实体的 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>();
}
实体框架支持论坛中的这篇文章展示了如何使用反射来查找 ID 字段及其详细信息。
实体类仍然是一个继承自 System.Data.Objects.DataClasses.EntityObject 的类,所以,我认为反射仍然可以处理它。
你试过了吗?你有什么错误吗?