如何使用xml文件为多个映射配置nHibernate?

如何使用xml文件为多个映射配置nHibernate?,nhibernate,many-to-many,Nhibernate,Many To Many,我已经为此挣扎了一段时间,看看我之前的问题 为了解决这个问题,我从头开始重新创建了我的项目。我有两个类Broker和Instrument,我有一个Broker和Instrument特有的属性,称为MinIncrement,我需要将其存储在数据库中的多映射表中。我创建了第三个类,名为BrokerInstrument,对这些额外信息进行建模。以下是我的课程代码: public abstract class Entity { public virtual int Version {get; p

我已经为此挣扎了一段时间,看看我之前的问题

为了解决这个问题,我从头开始重新创建了我的项目。我有两个类
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();            
    }
}
公共抽象类实体
{
公共虚拟整数版本{get;private set;}
}
公共类代理:实体
{
公共虚拟整数Id{get;set;}
公共虚拟字符串名称{get;set;}
公共虚拟bool IsDefault{get;set;}
公共虚拟布尔是活动的{get;set;}
公共虚拟ISet BrokerInstruments{get;set;}
}
公共类工具:实体
{
公共虚拟整数Id{get;set;}
公共虚拟字符串名称{get;set;}
公共虚拟字符串符号{get;set;}
公共虚拟ISet BrokerInstruments{get;set;}
}
公共类BrokerInstance:实体
{
公共虚拟代理{get;set;}
公共虚拟仪器{get;set;}
公共虚拟十进制最小增量{get;set;}
公共覆盖布尔等于(对象对象对象)
{
if(obj==null)
返回false;
var t=作为BrokerInstrument的obj;
如果(t==null)
返回false;
如果((工具==t.Instrument)和&(经纪人==t.Broker))
返回true;
返回false;
}
公共覆盖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>
  <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>

还有我正在处理的映射文件: BrokerInstrument.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>
  <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>

我很确定
复合id
标记中包含的元素是错误的。你知道里面应该放什么吗?另外,我的课堂设计是否适合支持这种模式

更新1

回应科尔的回答。我已进行了建议的更改,现在出现以下错误:

测试“Test.Test.CanadBrokersTrument”失败:TestFixtureSetUp 考试不及格

TestFixture失败:NHibernate.PropertyNotFoundException:无法 在类中查找属性“BrokerInstrumentIdentifier”的getter 'MooDB.Domain.BrokerInstrument'


键多对一
中的name属性应该是
BrokerInstrument
类中对象的属性名

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

编辑:
这不是真正的M:N关系。这是3个实体之间的M:1&1:N关系。从建模和查询的简单性出发,我将为BrokersTrument分配一个Id,同时不再需要复合键


任何时候你都应该避免复合材料。这种类型的映射是针对遗留数据库的。

Cole我更新了我的问题,因为还有一个问题。@MarkAllison删除您的
复合id
标记中的所有属性。我很困惑。你是在建议我删除你在回答中的那些行吗?如果这样做,我会得到以下错误:“XML验证错误:命名空间“urn:nhibernate-mapping-2.2”中的元素“composite id”的内容不完整。”@MarkAllison不,这不是我的建议。看看我的编辑,杰森,我倾向于不同意你的观点,尤其是你答案的最后一行。代理密钥只会浪费磁盘空间,增加页面大小,从而影响性能。为了让ORM工具完成我所需要的工作而不得不对数据库设计进行篡改,这似乎是不雅观的。在许多关系中,复合主键是良好的数据库设计,而不是您所说的“遗留”。空间和性能不是使用当今技术避免非复合主键的有效参数。我确实按照您的建议使用了它,尽管它仍然“感觉”错误。我相信我会克服的。