Как настроить nHibernate для сопоставления многие-многие с файлами XML? - PullRequest
0 голосов
/ 10 января 2012

Я некоторое время боролся с этим, см. Мой предыдущий вопрос Как настроить nHibernate для сопоставления многие-многие?

Я пересоздал свой проект с нуля, пытаясьреши это.У меня есть два класса Broker и Instrument, и у меня есть свойство, уникальное для Broker и Instrument с именем MinIncrement, которое мне нужно сохранить в моей таблице сопоставления многих в базе данных.Я создал третий класс под названием BrokerInstrument для моделирования этой дополнительной информации.Вот код для моих классов:

public abstract class Entity
{
    public virtual int Version {get; private set;}
}

public class Broker : Entity
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual bool IsDefault { get; set; }
    public virtual bool IsActive { get; set; }
    public virtual ISet<BrokerInstrument> BrokerInstruments { get; set; }
}

public class Instrument : Entity
{
    public virtual int Id { get;  set; }
    public virtual string Name { get;  set; }
    public virtual string Symbol {get;  set;}
    public virtual ISet<BrokerInstrument> BrokerInstruments { get; set; }

}

public class BrokerInstrument : Entity
{
    public virtual Broker Broker { get; set; }
    public virtual Instrument Instrument { get; set; }
    public virtual decimal MinIncrement { get; set; }

    public override bool Equals(object obj)
    {
        if (obj == null)
            return false;

        var t = obj as BrokerInstrument;
        if (t == null)
            return false;

        if ((Instrument == t.Instrument) && (Broker == t.Broker))
            return true;

        return false;
    }

    public override int GetHashCode()
    {
        return (Broker.Name + "|" + Instrument.Symbol).GetHashCode();            
    }
}

Мои файлы сопоставления выглядят следующим образом: Broker.hbm.xml

  <class name="MooDB.Domain.Broker,MooDB" table="brokers">
    <id name="Id" column="brokerId" type="Int32" unsaved-value="0">
      <generator class="native" />
    </id>
    <version name="Version" column="version" type="integer" unsaved-value="0" />
    <property name="Name" column="`name`" type="String" length="50" not-null="true" />
    <property name="IsActive" column="isActive" type="bool" not-null="true" />
    <property name="IsDefault" column="isDefault" type="bool" not-null="true" />
  </class>

Instrument.hbm.xml

  <class name="MooDB.Domain.Instrument,MooDB"  table="instruments">
    <id name="Id" column="instrumentId" type="Int32" unsaved-value="0">
      <generator class="native"></generator>
    </id>
    <version name="Version" column="version" type="integer" unsaved-value="0"/>
    <property name="Symbol" column="symbol" type="string" length="10" not-null="false"/>
    <property name="Name" column="`name`" type="string" length="30" not-null="false"/>
  </class>

И файл сопоставления, с которым я борюсь: BrokerInstrument.hbm.xml

  <class name="MooDB.Domain.BrokerInstrument,MooDB"  table="brokerInstruments">
    <composite-id name="BrokerInstrumentIdentifier" class="BrokerInstrument" >
      <key-many-to-one class="Broker" column="brokerId" name="Id" />
      <key-many-to-one class="Instrument" column="instrumentId" name="Id" />
    </composite-id>
    <property name="MinIncrement" column="minIncrement" type="decimal" not-null="true" />
  </class>

Я почти уверен, что элементы, заключенные в теги composite-id, неверны.Вы знаете, что должно идти туда?Кроме того, мой дизайн класса выглядит правильным, чтобы поддержать эту модель?

ОБНОВЛЕНИЕ 1

В ответ на ответ Коул.Я сделал предлагаемое изменение, и теперь я получаю эту ошибку:

Сбой теста «Test.Test.CanAddBrokerInstrument»: Сбой TestFixtureSetUp в Test

Сбой TestFixture: NHibernate.PropertyNotFoundException: Couldне найден метод получения свойства 'BrokerInstrumentIdentifier' в классе 'MooDB.Domain.BrokerInstrument'

Ответы [ 2 ]

0 голосов
/ 10 января 2012

на самом деле это не отношения M: N.это отношения M: 1 & 1: N между 3 объектами.Из-за простоты моделирования и запросов я бы назначил Id для BrokerInstrument и исключил бы необходимость в составном ключе все вместе.

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

0 голосов
/ 10 января 2012

Атрибут name в вашем key-many-to-one должен быть именем свойства вашего объекта в вашем BrokerInstrument классе.

<key-many-to-one class="Broker" column="brokerId" name="Broker" />
<key-many-to-one class="Instrument" column="instrumentId" name="Instrument" />

Редактировать:

<class name="MooDB.Domain.BrokerInstrument,MooDB"  table="brokerInstruments">
    <composite-id>
      <key-many-to-one class="Broker" column="brokerId" name="Broker" />
      <key-many-to-one class="Instrument" column="instrumentId" name="Instrument" />
    </composite-id>
    <property name="MinIncrement" column="minIncrement" type="decimal" not-null="true" />
</class>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...