エンティティの ID フィールド名 (プロパティ名) を取得しようとしていますが、可能ですか?
ユーザー user= new User(); //ユーザーはエンティティです
文字列 idField = ??????? //user.UserId
エンティティの ID フィールド名 (プロパティ名) を取得しようとしていますが、可能ですか?
ユーザー user= new User(); //ユーザーはエンティティです
文字列 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;
}
両方の機能を 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>();
}
Entity Framework サポート フォーラムのこの投稿では、リフレクションを使用して ID フィールドとその詳細を検索する方法を示しています。
EntityクラスはやはりSystem.Data.Objects.DataClasses.EntityObjectを継承したクラスなので、リフレクションはまだ動くと思います。
試してみましたか?エラーは出ますか?