2011-07-26 314 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>