从ClassMap 中查找主键

使用Fluent NHibernate ,我有一个任意的ClassMap ,我希望能够找出哪个属性(如果有的话)被设置primary key

例:

 public class PersonMap : ClassMap { public PersonMap() { Id(p => p.StupidPrimaryKeyId).GeneratedBy.Identity().Column("StupidPrimaryKeyId"); } } ... //usage MemberInfo primaryKeyMember = FindPrimaryKey(new PersonMap()); 

任何人都可以告诉我FindPrimaryKey的方法体必须是什么才能返回StupidPrimaryKeyId

编辑:1/10/12

我原本想要这个,因为我想知道数据库中是否存在一个独立的实体,仅仅基于主键(因此我需要知道主键成员,而不是字符串)。 我设置了这条路径,因为我们的代码库中已经存在很多这样的代码。 在重新思考问题后,我反而意识到映射应该已经处理好了,所以使用NHibernate.Linq我知道这个:

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

所以…我用Reflector检查了Fluent-Nhibernate dll,这就是我想到的:

 public string FindPrimaryKey(ClassMap 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) Id.GetType().GetField("columns", BindingFlags.Instance | BindingFlags.NonPublic) .GetValue(Id)).SingleOrDefault(); return PKName; } 

通过轻松编辑

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

 public Member FindPrimaryKey(ClassMap 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”列名称。

我必须说我很想知道你为什么需要它。