如何使用额外的条件进行Fluent NHibernate ClassMap连接

时间:2012-10-18 17:11:37

标签: nhibernate fluent-nhibernate fluent-nhibernate-mapping

我在尝试通过连接将属性映射到另一个表但是有额外的标准时遇到了问题。我的代码是针对我尝试加入的类,我基本上想通过加入TestLog表来加入ServerEventLog属性,但是在测试日志表中定义的进程中搜索特定的Message类型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(突出显示了我不能在stared位之间生成的位)。

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

如果有人知道如何通过ClassMap实现这一点,那么任何帮助都将非常受欢迎。干杯

1 个答案:

答案 0 :(得分: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");