Итак, через 3 года я вернулся, чтобы сообщить, как я это решил.
public class Foo :Entity {
public virtual ISet<FooBar> BarIDs { get; protected internal set; }
} ...
public class FooBar :Entity {
protected internal FooBar() { }
protected internal FooBar(Foo f, int BarID) { ... }
public virtual Foo Foo { get; protected internal set; }
public virtual int BarID { get; protected internal set; }
}
Это в основном то, что предложил Стефан, и на что намекает в соответствующем посте. Вам просто нужно съесть накладные расходы на написание дополнительной сущности и ссылки на нее. Помните, что я храню BarID вместо полных объектов Bar, потому что я имею дело с жесткой границей между двумя базами данных: столбцы хранятся в совершенно другой базе данных на другой платформе, чем Foos. В противном случае, конечно, вам гораздо лучше просто сказать Фу, что у него ISet<Bar>
.
Найти Foos с помощью SelectedBarIDs очень просто, так же, как предложил Тилак:
session.QueryOver<Foo>().JoinQueryOver<FooBar>(f => f.BarIDs).
WhereRestrictionOn(b => b.BarID).IsIn(...)...
Это интересная проблема, работать через границу базы данных, как это. Я не могу сказать, что мне нравится это делать, но если кто-то собирается потратить время на то, чтобы сохранить список баров и сделать его доступным для моего использования, для меня было бы огромной тратой ресурсов сделать то же самое. , Так что небольшая неэффективность наличия класса-обертки оправдать очень просто.