NHibernate коллекция сопоставлений с несколькими столбцами

#nhibernate

#nhibernate

Вопрос:

У меня такая ситуация:

У меня есть несколько таблиц table_1, table_2 … table_n, они принадлежат разным данным, но у них есть несколько общих полей, record_id, form_id, где id является первичным ключом. Все эти таблицы представлены одной записью класса (идентификатор, форма, атрибуты)

У меня есть другая таблица tbl_attachments, которая имеет attachment_id, record_id, form_id (record_id недостаточно, потому что record_id может повторяться над таблицами table_X.

Проблема, с которой я сталкиваюсь, заключается в том, что я хочу иметь вложения свойств в записи класса, чтобы получать вложения записей из tbl_attachments, если таковые имеются.

Можете ли вы помочь мне с сопоставлением в nhibernate, чтобы это сделать?

Я ценю любую помощь.

Редактировать: Забыл сказать, что запись в table_X может иметь несколько вложений 🙂

Ответ №1:

вы можете добиться этого с помощью AnyMapping

 abstract class RecordBase
{
    public virtual int Id { get; set; }

    public virtual int FormId { get; set; }
    public virtual ICollection<Attachment> Attachments { get; set; }
}

class RecordA : RecordBase
{ }

class Attachment
{
    public virtual int id { get; set; }

    public virtual RecordBase Record { get; set; }
}

class RecordAMap : ClassMap<RecordA>
{
    public RecordAMap()
    {
        HasMany(x => x.Attachments)
            .Where("Form_Id = 5");
    }
}

class AttachmentMap : ClassMap<Attachment>
{
    public AttachmentMap()
    {
        ReferencesAny(x => x.Record)
            .EntityIdentifierColumn("record_id")
            .EntityTypeColumn("form_id")
            .IdentityType<int>()
            .AddMetaValue<RecordA>("5");
    }
}
  

ОБНОВЛЕНИЕ: сопоставления xml

 <bag where="form_id=5">
  <key column="record_id"/>
  <one-to-many class="Attachment1"/>
</bag>

<any name="Item" id-type="System.Int32" meta-type="System.Int32">
  <column name="form_id" />
  <column name="record_id" />
</any>
  

Комментарии:

1. Фиро, спасибо за быстрый ответ, я использую XML-файлы hbm, не могли бы вы сообщить мне, как сопоставить hasMany (x => x.Вложения). Где («Form_Id = 5»); в файле hbm?