如何使用额外的条件进行流畅的NHibernate类映射联接

如何使用额外的条件进行流畅的NHibernate类映射联接,nhibernate,fluent-nhibernate,fluent-nhibernate-mapping,Nhibernate,Fluent Nhibernate,Fluent Nhibernate Mapping,我在尝试通过联接将属性映射到另一个表时遇到问题,但有额外的条件。我下面的代码是针对我试图从中加入的类的,我基本上希望加入ServerEventLog属性,方法是加入TestLog表,但在测试日志表中定义的流程中搜索特定的消息类型id public class ExecutedTest { public virtual int Id { get; set; } public virtual TestLog TestLog { get; set; } public vir

我在尝试通过联接将属性映射到另一个表时遇到问题,但有额外的条件。我下面的代码是针对我试图从中加入的类的,我基本上希望加入ServerEventLog属性,方法是加入TestLog表,但在测试日志表中定义的流程中搜索特定的消息类型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");

                });
    }
}
如果有人知道如何通过类映射实现这一点,我们将不胜感激。干杯

这不是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*/);
    }
}

非常感谢这正是我想要的。
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*/);
    }
}
// in ExecutedTestMap
HasMany(x => x.ServerEventLogs)
    .KeyColumn("ExecutedTestId")
    .Where("ExecutedTestId")
    .KeyColumn("MessageTypeId = 9");