2016-11-17 8 views
1

Ich muss alle Benutzer mit einer gültigen Wish -Eigenschaft (also nicht null) abrufen. Dies ist die xml meiner Klasse:Nhibernate Abfrage mit Null Kind

<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> 

Verfahren alle meine Benutzer zu erhalten, ist die folgende:

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); 
    } 
} 

Wie Sie sehen können, habe ich die Beschränkung auf das Kind-Objekt hinzugefügt. Dies funktioniert nicht ordnungsgemäß, da die Methode alle Benutzer einschließlich der mit der Eigenschaft Wish als null zurückgibt. Irgendeine Hilfe?

dies ist die xml für Kind:

<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> 
+0

Sie sollten 'Wish' Mapping auch einschließen. –

+0

Ich habe den Beitrag aktualisiert – Ras

Antwort

1

Nun, es gibt einen Fehler mit one-to-one und null Prüfung der Seite, die möglicherweise nicht existiert. Ich war schon darauf gestoßen, habe es aber vergessen. Die property-ref machen es nur ein wenig schwieriger zu diagnostizieren, aber es existiert tatsächlich auf one-to-one auch.

Hier ist die entsprechende issue in NHibernate Tracking-Tool.

Problemumgehung: Test für null Status einer nicht nullbaren Eigenschaft von Wish, wie Wish.Views.

Verzeihen Sie die wilde Vermutung auf Test Syntax, ich nicht mehr seit Jahren verwenden, sondern versuchen, mit gutem Beispiel:

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.Views")); 
     return users.PagedList<User>(session, pageIndex, pageSize); 
    } 
} 

Mit bestätige ich, diese Abhilfe mit meinen eigenen Projekten arbeitet, die mit gutem Beispiel gibt :

// The "TotalAmount != null" seems to never be able to come false from a 
// .Net run-time view, but converted to SQL, yes it can, if TransactionRecord 
// does not exist. 
// Beware, we may try "o.TransactionsRecord != null", but you would get struck 
// by https://nhibernate.jira.com/browse/NH-3117 bug. 
return q.Where(o => o.TransactionsRecord.TotalAmount != null); 

ich meine andere Antwort halten, da Sie stattdessen ein many-to-one mit berücksichtigen kann, vor allem, da Sie eine Richtungsunempfindlicher Mapping gemacht nicht haben (keine entsprechenden constrainedone-to-one in Wish) zusätzlich zu keinen tatsächlichen one-to-one. many-to-one leidet nicht unter dem Fehler.

0

one-to-one Mapping property-ref ist keine "tatsächliche" one-to-one, und in der Regel ist dies ein Zeichen ist ein many-to-one Mapping stattdessen verwendet werden soll.
Vielleicht hängt das nicht mit Ihren Problemen zusammen, aber Sie können es versuchen.

Ein "tatsächlicher" eins-zu-eins hat den Primärschlüssel der abhängigen Tabelle gleich dem Primärschlüssel der Elterntabelle. (Abhängige Tabelle, Wish in Ihrem Fall würde einen fremden Primärschlüssel hat, UserId in Ihrem Fall. Sehen Sie dieses example.)

ich irgendwann habe "gespielt" mit 'one-to-one Immobilien-ref' und Ich habe immer aufgehört, es wegen vieler Probleme aufzugeben. Ich ersetzte das durch mehr klassische Mappings, indem ich entweder meine db änderte, um eine Eins-zu-eins-Eins zu verwenden, oder eine Eins-zu-Eins-Methode verwendete und mit einer Sammlung auf der Kindseite lebte, obwohl sie immer ein einzelnes Element enthielt.