NHibernate映射

时间:2011-02-24 16:26:20

标签: c# nhibernate

我有一个像这样的表架构

Id
CompanyName
EmailAddress
EmailAddressHash
Phone1
Phone1Hash
Phone2
Phone2Hash

像这样的班级成员

 class HashValue
{
  //properties
  public string OriginalValue;
  public string HashValue;
}

class HashedApplication
{
  //properties
  public HashValue Email;
  /*Phone 1 and 2*/
  public List<HashValue> PhoneNumbers;
  public int Id;
  Public string CompanyName;
}

我想知道如何在NHibernate中映射这个表和类。

2 个答案:

答案 0 :(得分:2)

您应该将Email类的HashedApplication属性映射为component。 因此,如果您将HashValue类型创建为值类型,也会更好。

PhoneNumbers集合可以映射为一个集合,其中包含composite-element

                                           

Offcourse,这意味着您必须更改PhoneNumbers集合的数据模型;您必须创建另一个表,其中包含与特定HashedApplciation相关的PhoneNumbers。 (这是更好的,因为你的数据模型然后被标准化。)

答案 1 :(得分:1)

我不会浪费时间试图弄清楚如何弯曲NHibernate来处理这个设计糟糕的表格结构,出于恐惧(我将来可能会遇到这个解决方案),我提供以下内容;-)如果可以的话更改它,然后正确地规范化数据库。

我将从重构设计开始。创建

Company Table[Id, CompanyName EmailAddress EmailAddressHash] 

ContactDetails[Id, CustomerId, Phone, PhoneHash ] 

创建多对一关系。然后看看创建NHibernate映射。

创建以下映射。

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="STOE.Bll" assembly="Bll">
  <class name="Company" table="CompanyTable" mutable="false">
     <id name="Id" column="Id" unsaved-value="0">
      <generator class="identity"/>
    </id>
   <property name="Name"  column="CompanyName" />
   <property name="EmailAddress"  column="EmailAddress" />
   <property name="EmailAddressHash"  column="EmailAddressHash" />
   <bag name="CompanyContactDetails" lazy="false" table="ContactDetails" inverse="true" cascade="all">
      <key column="CustomerId" />
      <one-to-many class="STOE.Bll.CompanyContactDetail, Bll" />
    </bag> 
  </class>
</hibernate-mapping>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="STOE.Bll" assembly="Bll">
  <class name="CompanyContactDetail" table="CompanyContactDetail" mutable="false">
     <id name="Id" column="Id" unsaved-value="0">
      <generator class="identity"/>
    </id>
   <property name="Phone"  column="Phone" />
   <property name="PhoneHash"  column="PhoneHash" />

  </class>
</hibernate-mapping>