0

誰もが助けてくれることを願っています。私はこのサードパーティのデータベースに対して開発する必要があり、私は彼らのくだらないデザインに固執しています。それでも、NHibernateを使用したいので、フープを飛び越えなければなりません。

簡略化すると、「Transportation」テーブルの関係を持つこの「Event」テーブルがあります。トランスポートテーブルには、フィールド「ID」と「FK_EventID」で構成される複合主キーがあります。後者はもちろん、イベントレコードを参照します。各イベントは、輸送テーブル内の1つの別個のレコードを指しているため、実際には1対1の関係になります。どちらのフィールドもGuidsBTWです。

これをマッピングしようとすると、これがクラスの作成方法です(簡単にするために他のデータフィールドは省略します)。

   public class FcoEvent : IFcoObject
   {
       public virtual Guid ID { get; set; }

       //public virtual Guid FK_TransportationID { get; set; } //ignore
       public virtual FcoTransportation Transportation { get; set; } 

と:

[Serializable]
public class FcoTransportation : IFcoObject
{
    #region Members

    public virtual Guid ID { get; set; }

    public virtual Guid FK_EventID { get; set; }

マッピングファイルで私はこれを試みています(私は多対1を使用していることに注意してください):

   <class name="FcoLib.FcoEvent, FcoLib" table="FCO_Event">
     <id name="ID" column="ID">
      <generator class="guid" />
     </id>
     <many-to-one name="Transportation" not-found="ignore" cascade="save-update"
                 class="FcoLib.FcoTransportation, FcoLib">
     <column name="FK_TransportationID" />
     <column name="ID" />
    </many-to-one> 

と:

   <class name="FcoLib.FcoTransportation, FcoLib" table="FCO_Transportation">
     <composite-id>
       <key-property name="ID" />
       <key-property name="FK_EventID" />
     </composite-id>

これを実行しようとすると、次の例外メッセージが表示されます。

NHibernate.QueryException:プロパティを解決できませんでした:FK_TransportationID of:FcoLib.FcoEvent

私の最初の予感は、フィールド名にスペルミスがあるかもしれないということでしたが、それは当てはまりませんでした。だから今、私は完全に困惑していて、どのように進めるかがわかりません。どんな助けでも大歓迎です。Thnx。


アップデート

エラーの原因を見つけたと思います。マッピングエラーだと思っていたので、まだ調べていませんでしたが、クエリエラーのようです。これは、クエリを実行する場所で発生します。

fcoEvents = session.CreateCriteria(typeof(FcoEvent))
                    .Add(Restrictions.Eq("ID", eventId))
                    .Add(Restrictions.Eq("FK_TransportationID", transportId))
                    .List<FcoEvent>();

これについてさらに詳しく調べますが、明らかに別の方法でこれを照会する必要があります...

4

1 に答える 1

0

愚かな私。私はいくつかの欠陥のある古いコードに気を取られてきました。重要なのは、イベントの主キーを使用して、関連するトランスポートの子を含むイベントを取得できるようにすることでした。これは単純に機能します。また、複合主キーを使用してトランスポートの問題を取得できる必要があります。これは、以下のコードで実行できます。

    public FcoTransportation GetTransportation(Guid transportId, Guid eventId)
    {
        FcoTransportation transport;

        ISession session = Factory.OpenSession();
        ITransaction tx = session.BeginTransaction();
        try
        {
            transport = session.Get<FcoTransportation>(new FcoTransportation()
               {
                   ID = transportId,
                   FK_EventID = eventId
               });

したがって、これは実際には問題ではありません。複合外部キー全体に混乱しました。人々の時間を無駄にしないことを願っています。

于 2010-10-10T10:21:02.353 に答える