Ik heb een probleempje; om met de deur in huis te vallen.
Ik heb 2 classes die er ongeveer zo uit zien:
Zoals je dus kan zien, bevat class1 een dictionary die instances van class2 bevat. Class2 bevat op zijn beurt opnieuw een dictionary.
Nu is het zo dat, als ik een item uit de dictionary van class1 verwijderd:
Dat dit niet resulteert in een delete uit de DB, en dat vind ik een beetje vreemd.
Als ik nl. iets verwijder uit de dictionary uit class2:
Dan genereert NHibernate hier wel een delete statement voor. Het verschil zit 'm er natuurlijk in dat die eerste dictionary (uit class1) dus 'complexe' items bevat (instances van class2), en die andere dictionary bevat gewoon strings.
M'n mapping files zien er ongeveer als volgt uit (ik doe gewoon ff de relevante dingen)
en voor class2
Wat ik ook vreemd vind is, dat als ik 'inverse=true' weghaal in de mapping van Class1 (daar waar ik die idictionary mapping specifieer), dat NHibernate dan wel een UPDATE statement genereert, en m'n 'key' en 'index' column op NULL wil zetten, ipv de hele reutemeut te verwijderen.
WTF doe ik hier verkeerd ?
Ik heb 2 classes die er ongeveer zo uit zien:
code:
1
2
3
4
5
6
| public class Class1 { private int _id; private IDictionary<string, Class2> _class2Collection; } |
code:
1
2
3
4
5
6
| public class Class2 { private int _id; private Class1 _owner; private IDictionary<string, string> _dictionary; } |
Zoals je dus kan zien, bevat class1 een dictionary die instances van class2 bevat. Class2 bevat op zijn beurt opnieuw een dictionary.
Nu is het zo dat, als ik een item uit de dictionary van class1 verwijderd:
code:
1
| _class2Collection.Remove (someKey); |
Dat dit niet resulteert in een delete uit de DB, en dat vind ik een beetje vreemd.
Als ik nl. iets verwijder uit de dictionary uit class2:
code:
1
| _dictionary.Remove (someKey); |
Dan genereert NHibernate hier wel een delete statement voor. Het verschil zit 'm er natuurlijk in dat die eerste dictionary (uit class1) dus 'complexe' items bevat (instances van class2), en die andere dictionary bevat gewoon strings.
M'n mapping files zien er ongeveer als volgt uit (ik doe gewoon ff de relevante dingen)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| <?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> <class name="Domain.Class1, Domain" table="Table1" lazy="false"> <id name="Id" access="field.camelcase-underscore" column="ProjectId" unsaved-value="-1"> <generator class="identity" /> </id> <map name="_class2Collection" access="field" table="Table2" lazy="false" cascade="all" inverse="true" > <key column="Id" /> <index column="Language" type="string" /> <one-to-many class="Domain.Class2, Domain" /> </map> </class> </hibernate-mapping> |
en voor class2
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| <?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> <class name="Domain.Class2, Domain" table="Table2" lazy="false"> <id name="_id" access="field" column="Id" unsaved-value="-1"> <generator class="identity" /> </id> <many-to-one name="_owner" column="ownerid" access="field" class="Domain.Class1, Domain" cascade="all" /> <map name="_dictionary" access="field" lazy="false" table="Table3" cascade="all" > <key column="Class2Id" /> <index column="key" type="string" /> <element column="Value" type="string" not-null="false" /> </map> </class> </hibernate-mapping> |
Wat ik ook vreemd vind is, dat als ik 'inverse=true' weghaal in de mapping van Class1 (daar waar ik die idictionary mapping specifieer), dat NHibernate dan wel een UPDATE statement genereert, en m'n 'key' en 'index' column op NULL wil zetten, ipv de hele reutemeut te verwijderen.
WTF doe ik hier verkeerd ?
https://fgheysels.github.io/