映射NHibernate中的结构化数据类

本文关键字:数据 结构化 NHibernate 映射 | 更新日期: 2023-09-27 18:17:46

我想将c#中的结构化数据类映射到NHibernate中的表

namespace X
{
    [DataContract]
    class StructureID
    {
        [DataMember] public string Value { get; set; }
    }
    [DataContract]
    class StructureNR
    {
        [DataMember] public string Value { get; set; }
    }
}
namespace Y
{
    [DataContract]
    class SubStructure
    {
        [DataMember] public string SomeData { get; set; }
        [DataMember] public string MoreData { get; set; }
    }
    [DataContract]
    class Structure
    {
        [DataMember] public StructureID StructureID { get; set; }
        [DataMember] public SubStructure SubData { get; set; }
        [DataMember] public string OtherData { get; set; }
    }
}

表将包含这样的列:

CREATE TABLE Structures (
    ID varchar(10) NOT NULL,
    SOME varchar(50) DEFAULT NULL,
    MORE varchar(50) DEFAULT NULL,
    OTHER varchar(50) DEFAULT NULL,
    PRIMARY KEY (ID)
);

StructureID和StructureNR类是语义包装器,可以让编译器分离"string"的不同含义,SubStructure将几个成员组合在一起。如何将Structure类映射到我的表以进行读写(到目前为止我们使用XML定义)?

映射NHibernate中的结构化数据类

您的解决方案应该遵循这些行,您将需要根据您的代码进行调整。

为id创建2个实体。然后,创建具有复合id的主实体,并通过一对一的关系进行连接。

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="StructureID" table="Structures"  >
    <id name="Value">
      <column name="ID"/>
      <generator class="assigned"/>
    </id>
  </class>
  <class name="StructureNR" table="Structures"  >
    <id name="Value">
      <column name="ID"/>
      <generator class="assigned"/>
    </id>   </class>
  <class name="SubStructure" table="Structures" >
    <composite-id name="StructureID" class="StructureID">
      <key-property name="Value">
        <column name="ID"></column>
      </key-property>
    </composite-id>
    <property name="SomeData">
      <column name="Some"/>
    </property>
    <property name="MoreData">
      <column name="More"/>
    </property>
  </class>
  <class name="Structure" table="Structures"  >
    <composite-id name="StructureID" class="StructureID">
      <key-property name="Value">
        <column name="ID"></column>
      </key-property>
    </composite-id>
    <property name="OtherData">
      <column name="Other"/>
    </property>
    <property name="Description">
      <column name="Description"/>
    </property>
    <one-to-one name="SubData" class="SubStructure"  />
  </class>
</hibernate-mapping>