从ClassMap中查找主键<;T>;
本文关键字:lt gt ClassMap 查找 | 更新日期: 2023-09-27 18:19:55
对于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
我最初想要这样做是因为我想知道数据库中是否存在分离的实体,仅基于主键(因此我需要知道主键成员,而不是字符串)。我之所以走这条路,是因为我们的代码库中已经存在很多这样的代码。在重新思考这个问题后,我意识到映射应该已经解决了这个问题,所以使用NHibernate
public virtual bool RecordExists(TRecord obj)
{
var exists = _session.Query<TRecord>().Where(r => r == obj).Any();
return exists == false;
}
所以。。。我用Reflector
检查了Fluent-Nhibernate
dll,这就是我想到的:
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"列名。
我必须说,我很想知道你为什么需要它。