I need to retrieve all the users with a valid Wish property (so not null). This is the xml of my class:
<class name="Project.Engine.Domain.User,Project.Engine" table="Users" lazy="true">
<id name="UserID" column="UserID">
<generator class="native" />
</id>
<property name="Firstname" column="Firstname" type="string" not-null="true"
length="255" />
<property name="Lastname" column="Lastname" type="string" not-null="true"
length="255" />
<property name="Email" column="Email" type="string" not-null="true"
length="255" />
<one-to-one name="Wish" cascade="all" property-ref="UserID"
class="Project.Engine.Domain.Wish, Project.Engine" />
</class>
The method to get all my users is the following:
public PagedList<User> GetAll(int pageIndex, int pageSize,
string orderBy, string orderByAscOrDesc)
{
using (ISession session = NHibernateHelper.OpenSession())
{
var users = session.CreateCriteria(typeof(User));
users.Add(Restrictions.IsNotNull("Wish"));
return users.PagedList<User>(session, pageIndex, pageSize);
}
}
As you can notice, I have added the Restriction on the child object. This doesn't work properly as the method return all users including the ones with Wish property as null. Any help?
this is the xml for child:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="Project.Engine.Domain.Wish,Project.Engine" table="Wish" lazy="false">
<id name="WishID" column="WishID">
<generator class="native" />
</id>
<property name="UserID" column="UserID" type="int" not-null="true" length="32" />
<property name="ContentText" column="ContentText" type="string" not-null="false" length="500" />
<property name="Views" column="Views" type="int" not-null="true" length="32" />
<property name="DateEntry" column="DateEntry" type="datetime" not-null="true" />
</class>
</hibernate-mapping>
Well, there is a bug with
one-to-oneandnulltesting of the side which may not exist. I had already encountered it but forgot about it. Theproperty-refjust render it a bit more tricky to diagnose, but it does exist on actualone-to-onetoo.Here is its corresponding issue in NHibernate tracking tool.
Workaround: test for
nullstate of an non-nullable property ofWish, likeWish.Views.Forgive the wild guess on test syntax, I do not use nhibernate-criteria anymore since years, but try by example:
Using linq-to-nhibernate, I confirm this workaround works with my own projects, which gives by example:
I maintain my other answer since you may consider using a
many-to-oneinstead, especially since you do not have made a bidirectionnal mapping (no correspondingconstrainedone-to-oneinWish) in addition to not having an actualone-to-one.many-to-onedoes not suffer of the bug.