nhibernate:複合キーの多くのマッピング:プロパティを解決できない(外部キーコンポーネント)
-
29-09-2019 - |
質問
誰でもお手伝いできることを願っています。私はこのサードパーティのデータベースに反対しなければならず、私は彼らのくだらないデザインに留まっています。それでも、私はnhibernateを使用したいので、フープを飛び越えなければなりません。
簡略化された、「輸送」テーブルと関係があるこの「イベント」テーブルがあります。トランスポートテーブルには、フィールド「ID」と「FK_EVENTID」で構成される複合プライマリキーがあり、後者はもちろんイベントレコードを参照しています。各イベントは、トランスポートテーブルの1つの異なるレコードを指しているため、1対1の関係です。どちらのフィールドもガイドです。
これをマッピングしようとすると、これがクラスを作成した方法です(シンプルさのために他のデータフィールドを除外):
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; }
マッピングファイルでは、これを試みています(私は多くのものを使用していることに注意してください):
<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>();
私はこれをさらに見ますが、明らかに私はこれを別の方法で照会する必要があります...
解決
愚かな私。私は、いくつかの誤った、時代遅れのコードに気を取られています。ポイントは、イベントの主な鍵を使用して関連する輸送の子供を含むイベントを取得できることでした。また、複合プライマリキーでトランスポートの問題を取得することも可能であり、それは以下のコードで達成できます。
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
});
したがって、これは本当に問題ではありませんでした。私は、複合外のキーのもの全体に混乱しています。私は人々の時間を無駄にしなかったことを願っています。