私はレガシー テーブルで NHibernate を使用しています。コードベースを調べたところ、この必要があるのは私だけのようです。クエリを実行できるように 2 つのテーブルを結合する必要がありますが、今日は何も進んでいません。コード スニペットで意味のある箇所は省略してみます。お手伝いしますか?
テーブル --
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);
...
}
これらのテーブルを結合する無駄な試みでこれを混乱させるつもりはありませんが、結果がすべて OrderAppendix テーブルから同じ値を持っていることを前提として、OrderType や OrderLocation などでクエリを実行したいと考えています。
希望する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();
エイリアスを使用してテーブルに参加することは正しい方向に進んでいると思いますが、明らかに、必要な多対 1 のマッピングを NHibernate に通知する方法が見つかりませんでした。また、エイリアス機能を使用するために、OrderAppendix タイプのプロパティを Order に追加したことがわかります。