如何使用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工具完成我所需要的工作而不得不对数据库设计进行篡改,这似乎是不雅观的。在许多关系中,复合主键是良好的数据库设计,而不是您所说的“遗留”。空间和性能不是使用当今技术避免非复合主键的有效参数。我确实按照您的建议使用了它,尽管它仍然“感觉”错误。我相信我会克服的。