Finding the Primary Key from a ClassMap<T>

自作多情 提交于 2019-12-02 07:22:12
gdoron

So... I inspected Fluent-Nhibernate dll with Reflector and this is what I came-up with:

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

Edit by viggity

This is what I was really looking for. Thanks again!

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

end edit

PKName (if the column name assigned explicitly) will obtain the "StupidPrimaryKeyId" column name.

I must say that I'm curious to know why do you need it.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!