从ClassMap <t> </t>中查找主键

时间:2012-01-09 22:54:48

标签: c# nhibernate fluent-nhibernate

使用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.Linq我知道有这个:

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

1 个答案:

答案 0 :(得分:2)

所以...我用Fluent-Nhibernate检查了Reflector 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;
 }

以节奏编辑

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

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”列名。

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