Я некоторое время боролся с этим, см. Мой предыдущий вопрос Как настроить 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'