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

从ClassMap中查找主键<;T>;

所以。。。我用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"列名。

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