1

我在尝试通过连接但使用额外标准将属性映射到另一个表时遇到问题。我下面的代码是针对我尝试加入的类,我基本上想通过加入 TestLog 表来加入 ServerEventLog 属性,但在测试日志表中定义的进程中搜索特定的消息类型 ID。

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 回答