我在遗留表上使用 NHibernate,在查看了我们的代码库之后,我似乎是唯一有这种需求的人。我需要加入两个表,这样我才能运行查询,但我今天没有任何进展。我将尝试在我的代码片段中缩写它有意义的地方。愿意帮忙吗?
表——
Order
OrderID (primary key)
OrderName
OrderType
OrderLocation
OrderAppendix
ID (composite key)
Key (composite key)
Value (composite key)
OrderAppendix 复合键的 ID 部分与 Order 表中的 OrderID 相关联;因此,Order 可以在 OrderAppendix 表中有多个条目。
领域对象——
[Serializable]
public class Order
{
public virtual string OrderID { get; set; }
...
public virtual string OrderLocation { get; set; }
}
[Serializable]
public class OrderAppendix
{
public virtual string ID { get; set; }
public virtual string Key { get; set; }
public virtual string Value { get; set; }
public override bool Equals(object obj)
{
...
}
public override int GetHashCode()
{
...
}
}
映射
internal sealed class OrderMap : ClassMap<Order>
{
Table("Order");
Id(x => x.OrderID).Column("OrderID").Length(20).GeneratedBy.Assigned();
Map( x => x.OrderName).Column("OrderName")
....
}
internal sealed class OrderAppendixMap : ClassMap<OrderAppendix>
{
Table("OrderAppendix");
CompositeId()
.KeyProperty(x => x.ID, "ID")
....
Map( x => x.ID).Column("ID);
...
}
我不会因为加入这些表的徒劳尝试而混淆这一点,但我想做的是通过 OrderType 或 OrderLocation 之类的东西进行查询,因为结果都具有来自 OrderAppendix 表的相同值。
示例所需的 SQL
SELECT * FROM ORDER
INNER JOIN
ON Order.OrderID = OrderAppendix.ID
WHERE OrderAppendix.Key = "Stuff"
编辑
这是我通过阅读有关“QueryOver”的文档得到的
http://nhibernate.info/doc/nh/en/index.html#queryqueryover
Order Order = null;
OrderAppendix OrderAppendix = null;
resultList = session.QueryOver<Order>(() => Order)
.JoinAlias(() => Order.OrderAppendix, () => OrderAppendix)
.Where(() => OrderAppendix.Key == "MatchThis")
.List();
我认为我在使用别名加入表格的正确轨道上,但显然我还没有找到一种方法来通知 NHibernate 所需的多对一映射。此外,您可以看到我已将 OrderAppendix 类型的属性添加到 Order 以使用别名功能。