2012-01-09 12 views
1

Fluent NHibernateで、私は任意のClassMap<T>を持っています。どのプロパティ(もしあれば)がprimary keyに設定されているかを知りたいのですが。クラスマップからの主キーの検索

例:

public class PersonMap : ClassMap<Person> 
{ 
    public PersonMap() 
    { 
     Id(p => p.StupidPrimaryKeyId).GeneratedBy.Identity().Column("StupidPrimaryKeyId"); 
    } 
} 

... 

//usage 
MemberInfo primaryKeyMember = FindPrimaryKey(new PersonMap()); 

誰もがFindPrimaryKeyためのメソッド本体がStupidPrimaryKeyIdを返すためにでなければならないものを私に伝えることができますか?

編集:私はデタッチエンティティがデータベースに存在していたかどうかを知りたかったので1/10/12

私はもともとのみ、主キー(知るためのように私の必要性に基づいて、これを望んでいました主キーメンバー、文字列ではありません)。私は、このコードの多くが既にコードベースに存在していたので、このパスを設定しました。

public virtual bool RecordExists(TRecord obj) 
{ 
    var exists = _session.Query<TRecord>().Where(r => r == obj).Any(); 
    return exists == false; 
} 
+0

なぜあなたのC#コードの中にPKの列名を取得する必要がありますか? – gdoron

答えて

2

だから...私はReflectorFluent-Nhibernate dllファイルを検査し、これは次のとおりです。問題を再考した後、私の代わりに私はこのことを知っているNHibernate.Linqを使用して、マッピングがすでにそのの世話をする必要があることを実現しました私は何を来たアップ:viggity

によって

public string FindPrimaryKey<T>(ClassMap<T> map) 
{ 
    var providersInfo = map.GetType().BaseType.GetField("providers", BindingFlags.Instance | BindingFlags.NonPublic); 
    var providersValue = (MappingProviderStore) providersInfo.GetValue(map); 
    var Id = providersValue.Id 
    var PKName = ((List<string>) Id.GetType().GetField("columns", BindingFlags.Instance | BindingFlags.NonPublic) 
              .GetValue(Id)).SingleOrDefault(); 
    return PKName; 
} 

編集これは私が本当に探していたものです。再度、感謝します!

public Member FindPrimaryKey<T>(ClassMap<T> map) 
{ 
    var providersInfo = map.GetType().BaseType.GetField("providers", BindingFlags.Instance | BindingFlags.NonPublic); 
    var providersValue = (MappingProviderStore) providersInfo.GetValue(map); 
    var id = providersValue.Id; 
    var pkMemberInfo = (Member)id.GetType().GetField("member", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(id); 
    return pkMemberInfo; 
} 

エンド編集

PKName(明示的に割り当てられた列名の場合)、 "StupidPrimaryKeyId" 列名を取得します。

なぜ私はあなたがそれを必要としているのか分かりません。

+0

私は自分の疑問を推論し、私が実際に私の元の問題を解決している方法を編集しました。元の質問にうまく答えたので、私はあなたの答えに合格とマークしました。ありがとうgdoron! – viggity