2011-07-26 361 views
1

我使用HBM映射。 我有表:NHibernate映射

I)人與列: 1. ID 2. TYPE 3.CREATE_DATE 4.UPDATE_DATE

II)屬性與列: 1.ID 2,型號(在此實例中的人可以是所有類型) 3.NAME 4.CREATE_DATE 5.UPDATE_DATE

III)ATTRIBUTE_VALUE與列: 1.ID 2.VALUE 4.OBJECT_ID 5.ATTRIBUTE_ID 6.CREATE_DATE 7.UPDATE_DATE

有關係的一個一對多人(ID)和ATTRIBUTE_VALUE(OBJECT_ID)之間。 屬性(ID)和Attribute_VALUE(ATTRIBUTE_ID)之間存在一對多關係我需要構建對象PERSON,其中包含具有name屬性的所有人員和詞典列。 該字典包含鍵 - 屬性值的名稱 - 值的集合。

我可以建立適當的HBM?

回答

0

簡要回答

長回答:

考慮應該如何NHibernate的比賽你Attributes.Add("foo", "value")時屬性?它必須在數據庫中搜索一個屬性foo(這不是一個簡單的映射,它的邏輯),或者它會創建一個新的屬性,每次添加一個屬性。

所以給出了上述模式,你要麼一)有某種自定義的OnSave代碼(我認爲這是一個很大的努力)或B)你改變了人對

class Person 
{ 
    public virtual int Id { get; set; } 

    public virtual ICollection<AttributeValue> Attributes { get; set; } 

    public virtual IEnumerable<string> GetValues(string attributeName) 
    { 
     return Attributes 
      .Where(attr => attr.Attribute.Name == attributeName) 
      .Select(attr => attr.Value); 
    } 

    public virtual void AddValue(Attribute attribute, string value) 
    { 
     Attributes.Add(new AttributeValue 
     { 
      Attribute = attribute, 
      Value = value 
     }); 
    } 

    public virtual IEnumerable<string> GetAttributeNames() 
    { 
     return Attributes 
      .Select(attr => attr.Attribute.Name); 
    } 
} 

class Attribute 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    // and more Properties like created and updated 
} 

class AttributeValue 
{ 
    public virtual int Id { get; set; } 

    public virtual Attribute Attribute { get; set; } 
    public virtual string Value { get; set; } 

    // and more Properties like created and updated 
} 

和然後用

<class name="Person" table="Persons" xmlns="urn:nhibernate-mapping-2.2"> 
    <id name="Id" column="ID"/> 
    <bag name="Attributes"> 
    <key column="OBJECT_ID"/> 
    <one-to-many class="AttributeValue"/> 
    </bag> 
</class> 

<class name="Attribute" table="Attributes" xmlns="urn:nhibernate-mapping-2.2"> 
    <id name="Id" column="ID"/> 
    <property name="Name" column="Name"/> 
    <!--additional properties--> 
</class> 

<class name="AttributeValue" table="AttributeValues" xmlns="urn:nhibernate-mapping-2.2"> 
    <id name="Id" column="ID"/> 
    <many-to-one class="Attribute" column="ATTRIBUTE_ID"/> 
    <property name="Value" column="Value"/> 
    <!--additional properties--> 
</class>