Поиск первичного ключа из ClassMap <T> - PullRequest
1 голос
/ 10 января 2012

С 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 Ответ

2 голосов
/ 10 января 2012

Итак ... Я проверил Fluent-Nhibernate dll с Reflector, и вот что я придумал:

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.

Должен сказать, что мне любопытно узнать, зачем вам это нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...