Глобальные ссылки на объект находки в NHibernate

Действительно ли возможно работать, инвертированное глобальное - находят на NHibernate-управляемых-объектах?

А именно, у меня есть персистентный класс под названием "Io". Существует огромное количество полей через несколько таблиц, которые могут потенциально содержать объект того типа. Существует ли путь (приведен определенный пример объекта Io), для получения списка объектов (какого-либо типа), которые на самом деле ссылаются на тот конкретный объект? (Бонусные очки, если это может определить, какие определенные поля на самом деле содержат ссылку, но это не очень важно.)

Так как отображения NHibernate определяют все ссылки (и базовая база данных имеет соответствующие ссылки внешнего ключа), должен быть некоторый способ сделать это.

Вообразите этот вид структуры:

class Io
{
  public int Id { get; set; }
  // other fields specific to the Io type
}

class ThingOne
{
  public int Id { get; set; }
  public Io SensorInput { get; set; }
  public Io SolenoidOutput { get; set; }
  // other stuff
}

class ThingTwo
{
  public int Id { get; set; }
  public Io SensorInput1 { get; set; }
  public Io SensorInput2 { get; set; }
  public SubThing Doohickey { get; set; }
  // ...
}

class SubThing
{
  public int Id { get; set; }
  public Io ControlOutput1 { get; set; }
  // ...
}

Приведенный определенный пример Io, я хочу обнаружить, что на него ссылается ThingTwo с идентификатором 12. Или это на это ссылается это и также ThingOne с идентификатором 16. Если возможно, также что первая ссылка через SensorInput2, например.

6
задан Jaguar 16 September 2010 в 10:41
поделиться

2 ответа

Ну, сопоставления конфигурации, похоже, не предоставляют отношения FK, поэтому на данный момент некоторые размышления могут найти, какой объект types ссылается на это. Обратите внимание, что в приведенном ниже коде предполагается, что все классы, сопоставленные с 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();

, как вы можете догадаться, поскольку мы начинаем с размышления, мы можем закончить только отражением. Список результатов представляет собой массив, в котором каждая запись является результатом каждого критерия, где каждый критерий поиска может быть одним результатом или списком результатов.

4
ответ дан 17 December 2019 в 07:03
поделиться

Разве ваш класс «lo» не содержит ссылку на объект (ы), которые содержат объект «lo» (s)?

т.е. если «Lo» является ссылкой на некоторое количество объектов «Hi»:

public class Lo
{
    List<Hi> hiObjects;
}

Теперь, если у вас есть экземпляр «Lo»:

Lo lo = new Lo();
List<Hi> hiObjects = lo.hiObjects;

Если у вас нет такого типа ссылок, вы можете добавить их.

0
ответ дан 17 December 2019 в 07:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: