1

結合を介してプロパティを別のテーブルにマップしようとすると問題が発生しますが、追加の基準があります。以下のコードは、参加しようとしているクラス用です。基本的には、TestLog テーブルに参加し、テスト ログ テーブルで定義されているプロセスで特定のメッセージ タイプ ID を検索して、ServerEventLog プロパティに参加したいと考えています。

public class ExecutedTest
{
    public virtual int Id { get; set; }

    public virtual TestLog TestLog { get; set; }

    public virtual TestLog ServerEventLog { get; set; }
}

そして、テストログクラスは、マップしたいクラスです

public class TestLog
{
    public virtual int ID { get; set; }

    public virtual string Message { get; set; }

    public virtual int ExecutedTestId { get; set; }
}

以下のクラス マップを使用して、次のようなものを生成する SQL を取得できます。

SELECT ...
FROM [ExecutedTest] executedte0_ 
inner join TestLog executedte0_1_ on
  executedte0_.Id=executedte0_1_.ExecutedTestId 
WHERE executedte0_.Id=?

public class ExecutedTestMap : ClassMap<ExecutedTest>
{
    public ExecutedTestMap()
    {
        Id(x => x.Id);
        References(x => x.TestLog).Column("LogId").Cascade.All();
        this.Join(
            "TestLog",
            x =>
                {
                    x.KeyColumn("ExecutedTestId");

                });
    }
}

しかし、私が解決できないのは、結合基準を介して次のようにSQLを生成する方法です(凝視されたビットの間に生成できないビットを強調表示しています)。

SELECT ...
FROM [ExecutedTest] executedte0_ 
inner join TestLog executedte0_1_ on
  executedte0_.Id=executedte0_1_.ExecutedTestId
  **** and executedte0_1_.MessageTypeId = 9 ****
WHERE executedte0_.Id=?

誰かが ClassMap を介してこれを達成する方法を知っていれば、どんな助けも大歓迎です。乾杯

4

1 に答える 1

0

それは Join() の目的ではありません。Testlogをに分割できます

public virtual EventLog ServerEventLog { get; set; }


public class TestLog
{
    public virtual int ID { get; set; }

    public virtual string Message { get; set; }
}

public class EventLog : TestLog { }

public class TestLogMap : ClassMap<TestLog>
{
    public TestLogMap()
    {
        Id(x => x.Id);

        Map(x => x.Message, "Message");
        DiscriminateSubclassesOnColumn("MessageTypeId", 1 /*MessageTypeId of TestLog*/);
    }
}

public class EventLogMap : ClassMap<EventLog>
{
    public EventLogMap()
    {
        DiscriminatorValue(9 /*MessageTypeId of EventLog*/);
    }
}

または ServerEventLog を Collection に変更します

// in ExecutedTestMap
HasMany(x => x.ServerEventLogs)
    .KeyColumn("ExecutedTestId")
    .Where("ExecutedTestId")
    .KeyColumn("MessageTypeId = 9");
于 2012-10-19T09:12:44.743 に答える