Что ж, сопоставления конфигурации, по-видимому, не раскрывают отношения FK, так что пока какое-то отражение может найти, какой объект типов ссылается на это.
Обратите внимание, что в приведенном ниже коде предполагается, что у вас есть все сопоставленные с nhibernate классы для одной сборки, а также используется C # 3.0 и выше для поддержки LINQ.
IO toSearch = nhSession.Get<IO>(5);
var assembly = Assembly.Load("EntityAssembly");
IList<Type> assemblyTypes = assembly.GetTypes();
var searchType = toSearch.GetType();
var typesThatContainedSearchTypeProperty =
assemblyTypes.Where(
ast => ast.GetProperties().Count() > 0 &&
ast.GetProperties().Where(
astp => astp.PropertyType != null && astp.PropertyType == searchType).Count() > 0);
Теперь, если вы также хотите получить объекты, которые содержат этот конкретный экземпляр ввода-вывода, у вас может быть хороший MultiCriteria, чтобы сделать это за один раз.
var multiCrit = nhSession.CreateMultiCriteria();
foreach (var type in typesThatContainedSearchTypeProperty)
{
//maybe this class has multiple properties of the same Type
foreach (PropertyInfo pi in type.GetProperties().Where(astp => astp.PropertyType == toSearch.GetType()))
multiCrit.Add(nhSession.CreateCriteria(type).Add(Restrictions.Eq(pi.Name, toSearch)));
}
IList results = multiCrit.List();
как вы можете догадаться, поскольку мы начинаем с отражения, мы можем только закончить с отражением. Список результатов представляет собой массив, в котором каждая запись является результатом каждого критерия, где каждый критерий поиска может быть одним результатом или списком результатов.