public class Parent{
public long Id{get;set;}
public string Name{get;set;}
private IList<Child> children;
}
<class name="Parent">
<id name="Id">
<generator class="native" />
</ id>
<property name ="Name" />
<bag name ="children" access="field">
<key column="ParentId">
<one-to-many class="Child" />
</ bag>
</ class>
public class Child{
public long Id{get;set;}
public string Text{get;set}
public long ParentId{get;set}
}
<class name="Child" >
<id name="Id" >
<generator class="native" />
</ id>
<property name="Text" />
<property name="ParentId" />
</ class>Es ist Absicht, dass ein Child nur die ParentId kennt und nicht den Parent direkt. Es ist ebenfalls Absicht, dass children ein private field ist ohne irgend einen Zugriff, da ich diese Variable zu NH 1.2 Zeiten ausschlisslich für Query-Zwecke brauchte. Es gab nun folgende Criteria:using(var session = sessionFactory.OpenSession){
using(var transaction = session.BeginTransaction){
session.CreateCriteria<Parent>()
.Add(Restrictions.IsNotEmpty("children"))
.List<Parent>();
transaction.Commit();
}
}Diese Query funktioniert wunderbar. Was mich stört, ist die unnüze Variable children. Durch das neue none Feature, was eigentlich genau dafür gemacht wurde, dachte ich diese Variable elemenieren zu können. Also löschte ich nun children aus der Parent-Klasse und änderte das Parent-Mapping:<class name="Parent">Wenn ich die Query erneut ausführe, passiert jetzt etwas seltsames. Aus irgend einem Grund versucht NHibernate nun die ParentId im Child-Objekt auf NULL zu setzen. Mir ist schleierhaft wie das zu stande kommt. Auch cascade expliziet auf none zu schalten macht keinen Unterschied.
<id name="Id">
<generator class="native" />
</ id>
<property name ="Name" />
<bag name ="children" access="none">
<key column="ParentId">
<one-to-many class="Child" />
</ bag>
</ class>
Ich haben den Fehler im NHibernate JIRA gemeldet und zähneknirschend das private field children wieder in die Parent-Klasse eingebunden.