NHibernate i query only property
12 October, 2012-C#, NHibernate
Natrafiłem ostatnio na ciekawą i przydatną możliwość mapowania.
Wyobraźmy sobie następującą sytuację. Mamy dwie encje: Customer i Order.
public class Order { public int Id { get; set; } public decimal TotalPrice { get; set; } public Customer Customer { get; set; } } public class Customer { public int Id { get; set; } public string Name { get; set; } }
W strukturze obiektowej potrzebujemy tylko relację Order.Customer, natomiast nie chcemy mieć kolekcji Customer.Orders. Tylko jak teraz wybrać klientów, którzy nie mają zamówień?
Otóż da się to prosto uczynić wykorzystujac query only property. Zobaczmy na plik mapujący.
<class name="Order" table="Orders"> <id name="Id" column="Id"> <generator class="native"/> </id> <property name="TotalPrice" /> <many-to-one name="Customer" column="CustomerId" cascade="all" not-null="true"/> </class> <class name="Customer" table="Customers"> <id name="Id" column="Id"> <generator class="native"/> </id> <property name="Name" /> <bag name="Orders" access="none"> <key column="CustomerId" /> <one-to-many class="Order"/> </bag> </class>
Przy definicji mapowania kolekcji po stronie Customera używamy access=”none” albo access=”noop”. W naszym modelu ta relacja nie będzie widoczna, ale będzie mogli pisać zapytania przy jej użyciu. Poniższe wybieramy klientów, którzy mają co najmniej jedno zamówienia.
using (var s = sessionFactory.OpenSession()) { var customers = s.CreateQuery("from Customer c where size(c.Orders) > 0") .List(); foreach (var customer in customers) Console.WriteLine(customer.Name); }