我有一个像这样的表架构
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中映射这个表和类。
答案 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>