Отображение NHibernate

Я использую отображение HBM. У меня есть таблицы:

I) человек со столбцами: 1. ID 2. TYPE 3.CREATE_DATE 4.UPDATE_DATE

II) Атрибут со столбцами: 1.ID 2.TYPE (в этом примере человек может быть любого типа) 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 ??


person Vitaly    schedule 26.07.2011    source источник


Ответы (1)


краткий ответ нет.

длинный ответ:

подумайте, как nhibernate должен соответствовать атрибутам, когда вы Attributes.Add("foo", "value")? он должен искать в базе данных атрибут foo (который не является простым отображением, его логикой), или он будет создавать новый атрибут каждый раз, когда вы его добавляете.

Итак, учитывая приведенную выше схему, у вас либо a) есть какой-то пользовательский код onsave (который, я думаю, требует больших усилий), либо b) вы меняете Person на

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>
person Firo    schedule 27.07.2011