NHibernate - 任何类型的映射 - “我如何查询元值?”或“meta-type =”class“如何工作?”

时间:2013-11-25 09:39:27

标签: nhibernate nhibernate-mapping

我使用NHibernate 3.3.3并且有一个类映射,它使用NHibernet文档5.2.4中描述的“Any type mappings”。

目前看起来像这样:

<class name="AttributeValue" table="AttributValue">
  <id name="Id" column="ID" type="int" >
    <generator class="MyGenerator" />
  </id>
  <property   name="Value"    column="Value"      type="string" length="255"/>
  <many-to-one name="AttributeDef" column="AttributDef_ID" />

  <any name="Reference" id-type="Int32" meta-type="Int32">
    <meta-value value="1" class="MxObject"/>
    <meta-value value="500" class="Material"/>
    <meta-value value="5" class="Company"/>
    <meta-value value="10" class="Fluid"/>
    <meta-value value="10040" class="Contract"/>
    <meta-value value="504" class="Tool"/>

    <column name="Kontext"/>
    <column name="Oid"/>
  </any>
</class>

我的实体看起来像这样:

public class AttributeValue
{
    public AttributeValue() { }
    public virtual int Id { get; set; }
    public virtual string Value { get; set; }
    public virtual AttributeDef AttributeDef { get; set; }
    public virtual object Reference { get; set; }     
} 

映射中引用的其他实体有一个指向AttributeValue实体的集合,如下所示:

public virtual ICollection<AttributeValue> AttributeValueList { get; set; }

映射看起来像这样:

<bag name="AttributeValueList">
  <key column="OID"/>
  <one-to-many class="AttributeValue"/>
</bag>

一切都按预期工作。我可以查询我需要的所有东西,我可以保存它就好了。

这是我的问题。我正在编写一个测试,它接受我模型中的每个实体,并使用反射将带有随机数据的虚拟版本写入数据库,并通过对其他实体的引用递归迭代并创建它们。一切正常,直到我点击AttributeValue实体的属性。

public virtual object Reference { get; set; }

我只是不知道如何查询如何查询元数据或映射以找出可能放入该Reference属性的实体。

我试图以这种方式获取元值:

    var metadata = session.SessionFactory.GetClassMetadata(typeof(AttributeValue));
    var pType = metadata.GetPropertyType("Reference") as AnyType;
    var mType = (pType.Subtypes[0]) as MetaType;

但是MetaType类没有公开包含该特定信息的字典,我也没有真正看到从中获取可能的类列表的方法。

我也是通过

尝试过的
cfg.GetClassMapping(typeof(AttributeValue)) 

路由,但我最终只是再次获得MetaType类的实例。

有没有办法查询该特定信息?

如果没有,也许还有另一种方式?

我在NHibernate文档中找到了这个例子:

<any name="AnyEntity" id-type="Int64" meta-type="Eg.Custom.Class2TablenameType">
    <column name="table_name"/>
    <column name="id"/>
</any>

如果我看到了,那么我可以创建一个包含此信息的类并将其作为元类型属性传递。然后我可以查询该类以获取我想要的信息。

我只是不知道如何实现这个Class2TablenameType类,文档并不是很清楚(至少我真的不明白)如何做到这一点。

帮助将不胜感激。

0 个答案:

没有答案