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