OOP语言: C#Web应用程序
框架: MVC,Spring
ORM: NHibernate
我有一种情况需要映射未知的具体类。这是我的数据库结构: 表名: x_dog_linkage
id (Guid) | dog_id (Guid) | entity_id (Guid) | discriminator (String)
1234567 | 2345677894 | 65t3455434234 | Dogs.Model.DogType
5454444 | 8765434566 | 324t678r63343 | Dogs.Model.Gender
3434423 | 2345677894 | 8765434566 | Dogs.Model.Dog
我想把“狗”映射到任意数量的具体类,包括它自己的类。
这是我的x_dog_linkage表的映射文件:
<hibernate-mapping assembly="Dogs" namespace="Dogs.Model" xmlns="urn:nhibernate-mapping-2.2">
<class name="XDogLinkage" table="x_dog_linkage" lazy="true" >
<id name="Id">
<column name="id" sql-type="Guid" not-null="true" />
<generator class="assigned" />
</id>
<discriminator column="discriminator" type="string"/>
<many-to-one lazy="false" name="Dog" cascade="none">
<column name="dog_id" sql-type="Guid" not-null="true" />
</many-to-one>
<subclass name="LinkedGender" discriminator-value="Dogs.Model.Gender">
<key column="entity_id" />
</subclass>
<subclass name="LinkedDog" discriminator-value="Dogs.Model.Dog">
<key column="entity_id" />
</subclass>
...
...
<subclass name="LinkedDogType" discriminator-value="Dogs.Model.DogType">
<key column="entity_id" />
</subclass>
</class>
</hibernate-mapping>
这是我的模型对象:
public class XDogLinkage : Domain
{
public XDogLinkage() : base() { }
public XDogLinkage(Guid id) : base(id) { }
public virtual Dog Dog { get; set; }
public virtual Gender LinkedGender { get; set; }
public virtual Dog LinkedDog { get; set; }
...
...
public virtual DogType LinkedDogType { get; set; }
}
这是我的映射文件:
<hibernate-mapping assembly="Dogs" namespace="Dogs.Model" xmlns="urn:nhibernate-mapping-2.2">
<class name="XDogLinkage" table="x_dog_linkage" lazy="true" >
<id name="Id">
<column name="id" sql-type="Guid" not-null="true" />
<generator class="assigned" />
</id>
<property name="ObjectName1">
<column name="obj_col_1" sql-type="string" not-null="true" />
</property>
<property name="ObjectName2">
<column name="obj_col_2" sql-type="string" not-null="true" />
</property>
...
...
<bag name="XDogLinkages" inverse="true" cascade="none" lazy="true">
<key column="dog_id" />
<one-to-many class="XDogLinkage" />
</bag>
</class>
</hibernate-mapping>
这是我将使用XDogLinkage模型对象的模型对象:
public class Dog : Domain
{
public Dog() : base() { }
public Dog(Guid id) : base(id) { }
public virtual Object1 ObjectName1 { get; set; }
public virtual Object2 ObjectName2 { get; set; }
...
public virtual IList<XDogLinkage> XDogLinkages { get; set; }
}
我知道这个子类实现是错误的,但我把它放进去,所以每个人都得到了我想要做的事情的要点。我想以这种方式创建这个表的原因是因为这些具体的类在整个项目中共享不同的东西,我目前有15个不同的具体类,这个“狗”可以链接到;因此,创建15个与已创建的具体类具有相同属性的新链接类似乎是浪费。是否可以在NHibernate中创建这种类型的链接映射?
我尝试按照此文档进行操作,但这些解决方案似乎都无法正常运行。 NHibernate Inheritance Mapping