5

N:1別のテーブルに格納され、数式によって選択される親子関係を持つスキーマがあります。数式を使用して、このエンティティを親にマップすることは可能ですか?

public class ParentEntity {
    public virtual int ParentId { get; set; }
    public virtual ChildEntity Child{ get; set; }
}


public class ParentMapping : ClassMap<ParentEntity> {
    public ParentMapping() {
        Table("ParentTable");

        Id(x => x.ParentId).Column("ParentId").GeneratedBy.Assigned().Not.Nullable();
        References<ChildEntity>(x => x.Child).Formula(
            @"(
                SELECT TOP 1 ChildTable.ChildId
                FROM ChildTable
                WHERE ChildTable.ParentId = ParentId
            )"
        );
    }
}

このマッピングが生成する SQL は次のようになります。

SELECT
    this_.ParentId,
    this_.ChildEntity_id
FROM ParentTable this_ 

これは私が探しているものではありません。

ChildIdこの子エンティティを参照して、親テーブルではなく、数式から選択する数式を使用するにはどうすればよいChildIdですか?

4

1 に答える 1

4

このアプローチの正しさについては議論しませんが、答えてみてください。あなたがやろうとしていること:うまくいく はずです。テスト シナリオで数式の正確性を確認しました。したがって、はい、式はまさにこのように使用できます。

しかし、それは機能していないので、少し推測します。私のテスト ケースで生成された SQL から始めましょう。

SELECT this_.ParentId as ParentId3_0_
, (SELECT TOP 1 Child.ChildId
     FROM Child
     WHERE Child.ParentId = this_.ParentId) as formula1_0_ 
FROM Parent this_

考えられる問題

考えられる問題が 2 つあります

1. 異なる子 ID 列名

まず、スニペットで:

References<ChildEntity>(x => x.Child).Formula(
            @"(
                SELECT TOP 1 ChildTable.ChildId
                FROM ChildTable
                WHERE ChildTable.ParentId = ParentId
            )"

は子主キーの列名です:ChildId一方、SQL スニペットではChildEntity_id:

SELECT
    this_.ParentId,
    this_.ChildEntity_id
FROM ParentTable this_ 

2. SQL スニペットが一致しない

次に、(上記の SQL ステートメント) が生成されたものだとおっしゃいました。しかし、それはこのマッピングのステートメントに似ています:

References<ChildEntity>(x => x.Child).Column("ChildEntity_id")

実際に使用されている古い/他のマッピングはありませんか?

要約 私が言いたかったのは、このマッピング方法が機能していることです。あなたは正しい軌道に乗っていますが、悪魔は細部に隠れています ;)

于 2012-11-09T08:36:51.683 に答える