我使用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类,文档并不是很清楚(至少我真的不明白)如何做到这一点。
帮助将不胜感激。