从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”列名称。
我必须说我很想知道你为什么需要它。