【发布时间】:2012-01-10 18:26:49
【问题描述】:
我已经为此苦苦挣扎了一段时间,请参阅我之前的问题How to configure nHibernate for many-many mapping?
我从头开始重新创建了我的项目以试图解决它。我有两个类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>
仪器.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 测试失败
TestFixture 失败:NHibernate.PropertyNotFoundException:不能 在类中找到属性“BrokerInstrumentIdentifier”的吸气剂 'MooDB.Domain.BrokerInstrument'
【问题讨论】: