【问题标题】:NHibernate: Two foreign keys in the same table against same columnNHibernate:同一表中针对同一列的两个外键
【发布时间】:2013-04-12 06:54:37
【问题描述】:

我正在开发寄售预订软件。 寄售对象的结构如下:

public class Consignment
{
   //Other properties

   public virtual Station FromStation{get;set;}

   public virtual Station ToStation{get;set;}
}

这里是车站对象:

public class Station
{
   public virtual int StationId{get;set;}

   public virtual string StationName{get;set;}

    //I don't want this property but I have to keep it.
    public virtual Iesi.Collections.Generic.ISet<Consginment> ConsginmentFrom
    {
        get;
        set;
    }

    //I don't want this property but I have to keep it here.
    public virtual Iesi.Collections.Generic.ISet<Consginment> ConsginmentTo
    {
        get;
        set;
    }
}

在数据库端,会有一个 Station 表,而 Consignment 表会有两个 int 列(分别称为 FromStation 和 ToStation),用于存储车站的 id。

我不是一个 NHibernate 人,在谷歌搜索和阅读半天后,我想出了以下映射文件:

Station.hbm.xml

<class name="Station" table="Station">
    <id name="StationId" >
      <column name="STATION_ID" not-null="true" />
      <generator class="identity" />
    </id>
    <property name="StationName" >
      <column name="STATION_NAME" not-null="true"  />
    </property>
    <set name="ConsginmentFrom" inverse="true" lazy="true" generic="true">
      <key>
        <column name="StationId" />
      </key>
      <one-to-many class="Consignment" />
    </set>
    <set name="ConsignmentTo" inverse="true" lazy="false" generic="true">
      <key>
        <column name="StationId" />
      </key>
      <one-to-many class="Consignment" />
    </set>
  </class>

寄售.hbm.xml

<class name="Consignment" abstract="true"
           table="Consignment" lazy="false">
    <id name="ConsignmentId">
      <generator class="hilo"/>
    </id>

  <!--Column mapping for other properties-->

    <many-to-one name="FromStation" class="Station">
      <column name="STATION_ID" not-null="true" />
    </many-to-one>

    <many-to-one name="ToStation" class="Station">
      <column name="STATION_ID" not-null="true" />
    </many-to-one>


  </class>

但上面生成了奇怪的数据库结构。 我必须做 xml 映射文件,因为很多已经用 xml 编写了。 我做得对吗?有没有更好的办法?

感谢您阅读本文。

【问题讨论】:

  • 生成的数据库结构的架构是什么?

标签: c#-4.0 nhibernate nhibernate-mapping


【解决方案1】:

我发现映射有一些问题。

  1. FromStationToStation 属性映射到 Consignment 表中的同一列。它们应该映射到不同的列,例如 FROM_STATION_IDTO_STATION_ID

    <many-to-one name="FromStation" class="Station">
      <column name="FROM_STATION_ID" not-null="true" />
    </many-to-one>
    
    <many-to-one name="ToStation" class="Station">
      <column name="TO_STATION_ID" not-null="true" />
    </many-to-one>
    
  2. ConsignmentFrom 中的SetStation 中的ConsignmentTo 映射到StationID 而不是Station_Id。您还需要使用FROM_STATION_ID AND TO_STATION_ID 作为键列。

    <set name="ConsignmentFrom" inverse="true" lazy="true" generic="true">
      <key column="FROM_STATION_ID" />
      <one-to-many class="Consignment" />
    </set>
    
    <set name="ConsignmentTo" inverse="true" lazy="false" generic="true">
      <key colum="TO_STATION_ID" />
      <one-to-many class="Consignment" />
    </set>
    

另外,寄售在某些地方拼写错误,也可能造成一些混乱。

【讨论】:

  • 抱歉,货物拼写错误 :) 我尝试了您提供的代码。但现在它正在 CONSIGNMENT 表中创建一个 STATION_ID 列。这与 FROM_STATION_ID 和 TO_STATION_ID 不同。
  • 似乎上面的第二点是在寄售表中创建 Station_Id 列。
  • @James 抱歉,我从内存中进行了映射。请检查我的更新答案。
  • 是的,我会这样做!你现在可能已经知道我是多么的 NHibernate 文盲了!
  • 是的,讨厌的 Station_Id 不见了!感谢你的回答。它实际上解决了我在更多地方遇到的同样问题。从我与强大的 NHibernate 的短暂接触中,我学到了一些东西:1) xml 映射很混乱!尝试使用流利的 NHibernate。该代码比 xml 更具可读性。 2) 没有现有的工具可以为复杂的场景生成正确的映射。您需要对它们生成的映射文件进行一些调整。
猜你喜欢
  • 2011-02-03
  • 1970-01-01
  • 1970-01-01
  • 2015-12-30
  • 1970-01-01
  • 2018-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多