c# - 在 NHibernate 中全局查找对象引用

标签 c# nhibernate criteria

是否可以对 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 实例,我想发现它被 ID 为 12 的 ThingTwo 引用。或者它被那个和 ID 为 16 的 ThingOne 引用。如果可能的话,第一个引用也是通过 SensorInput2 ,例如。

最佳答案

好吧,配置映射似乎没有公开 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);

现在,如果您还想获取包含此特定 IO 实例的对象,您可以使用一个漂亮的 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();

您可以猜到,既然我们从反射(reflection)开始,我们就只能以反射(reflection)结束。结果列表是一个数组,每个条目都是每个条件的结果,其中每个条件搜索可以是单个结果或结果列表。

关于c# - 在 NHibernate 中全局查找对象引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2405894/

相关文章:

hibernate - 带条件的正则表达式

java - HQL:条件查询内的划分

java - 在java标准谓词中使用 native sql

c# - NServiceBus 端点可以订阅同一消息的多个发布者吗?

c# - 添加到 webmethods 的额外参数

c# - 如何改变 XNA 中的色调?

database - NHibernate:使用拦截器或触发器审计日志记录?

nhibernate - 如何使 Nhibernate 生成带有文本字段而不是 nvarchar 的表(255)

c# - 在消息处理程序中添加属性值

nhibernate - NHibernate QueryOver不存在的地方