2012-01-09 52 views
1

随着Fluent NHibernate,我有一个任意的ClassMap<T>,我想能够找出什么属性(如果有的话)被设置为primary key从类映射中找到主键<T>

例子:

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

... 

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

谁能告诉我什么FindPrimaryKey方法主体必须是为了回报StupidPrimaryKeyId

编辑:12年1月10日

我本来想这是因为我想知道在数据库中是否存在不分离实体,完全基于主键(因此我需要知道主键成员,而不是字符串)。我设定了这条路径,因为很多代码已经存在于我们的代码库中。重新思考了这个问题之后,我反而意识到映射应该已经采取照顾,所以使用NHibernate.Linq我知道有这样的:

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

为什么你需要在你的C#代码中获得PK的列名? – gdoron 2012-01-10 07:14:30

回答

2

所以...我检查Fluent-Nhibernate DLL与Reflector,这是我走上前来了:

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

编辑由viggity

这是我真正需要的。再次感谢!

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 2012-01-10 16:29:57