如何在NHibernate中映射(和配置)循环引用?

时间:2011-05-19 22:05:57

标签: c# sql-server nhibernate

我有2个表分别容纳Office位置和计算机:tblLocationtblMachine。这些表中的每一个都引用另一个。每个位置都有多台计算机(机器)。每个位置都可以向任何机器发送显示信息(无论位置如何)。一台机器可以是许多地方的显示机器。

我使用NHibernate作为ORM进行以下设置。

我的表格的简化示例:

  • tblLocationLocationId(pk),LocationNameDisplayMachineId(fk)
  • tblMachineMachineId(pk),MachineNameLocationId(fk)

我也有像这样的Location和Machine对象:

public class Location
{
    public virtual int LocationId { get; set; }
    public virtual string Name { get; set; }
    public virtual Machine DisplayMachine { get; set; }
    public virtual ISet<Machine> Machines { get; set; }
}

public class Machine
{
    public virtual int MachineId { get; set; }
    public virtual Location Location { get; set; }
    public virtual ISet<Location> Locations { get; set; }
}

以下是每个的映射文件:

<class name="DataTransfer.Machine,DataTransfer" table="tblMachine">
<id name="MachineId" column="MachineID" type="Int32" unsaved-value="0">
  <generator class="native"/>
</id>
<property name="Name" column="MachineName" type="string" not-null="true" />
<many-to-one name="Location" column="LocationID" not-null="false" class="DataTransfer.Location,DataTransfer" />
<set name="Locations" table="tblLocation" generic="true" inverse="true">
  <key column="DisplayFromMachineID" />
  <one-to-many class="DataTransfer.Location,DataTransfer"/>
</set>
<set name="MachineReportProperties" table="tblMachineReportProperty" generic="true" inverse="true">
  <key column="MachineID" />
  <one-to-many class="DataTransfer.MachineReportProperty,DataTransfer"/>
</set>
</class>

<class name="DataTransfer.Location,DataTransfer" table="tblLocation">
<id name="LocationId" column="LocationID" type="Int32" unsaved-value="0">
  <generator class="native"/>
</id>
<property name="Name" column="LocationName" type="string" not-null="true" />
<many-to-one name="DisplayMachine" column="DisplayFromMachineID" not-null="false" class="DataTransfer.Machine,DataTransfer" />
<set name="Machines" table="tblMachine" generic="true" inverse="true">
  <key column="LocationID" />
  <one-to-many class="DataTransfer.Machine,DataTransfer"/>
</set>
</class>

我在尝试查询数据库时收到外键冲突。

我试图重新开始并重新创建映射和对象/属性,以为我可能错误地配置了它们。在这个设置中有没有明显的遗漏?我意识到最终答案可能是改变数据库结构,我只是想知道我是否遗漏了任何东西。

注意:当我将数据库中的关系从tblMachine.MachineId(pk)移除到tblLocation.DisplayMachineId时,fk违规就会消失。

0 个答案:

没有答案