Je vais les noix ici pour essayer de résoudre une mise à jour en cascade/supprimer problème :-)cascade NHibernate - problème avec des entités indépendantes
J'ai une entité mère avec une collection d'entités enfants. Si je modifie la liste des entités enfant dans un objet parent détaché, en ajoutant, supprimant etc - je ne vois pas les mises à jour en cascade correctement à la collection enfant.
fichiers de mappage:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="Domain"
namespace="Domain">
<class name="Parent" table="Parent" >
<id name="Id">
<generator class="guid.comb" />
</id>
<version name="LastModified"
unsaved-value="0"
column="LastModified"
/>
<property name="Name" type="String" length="250" />
<bag name="ParentChildren" lazy="false" table="Parent_Children" cascade="all-delete-orphan" inverse="true">
<key column="ParentId" on-delete="cascade" />
<one-to-many class="ParentChildren" />
</bag>
</class>
<class name="ParentChildren" table="Parent_Children">
<id name="Id">
<generator class="guid.comb" />
</id>
<version name="LastModified"
unsaved-value="0"
column="LastModified"
/>
<many-to-one
name="Parent"
class="Parent"
column="ParentId"
lazy="false"
not-null="true"
/>
</class>
</hibernate-mapping>
test
[Test]
public void Test()
{
Guid id;
int lastModified;
// add a child into 1st session then detach
using(ISession session = Store.Local.Get<ISessionFactory>("SessionFactory").OpenSession())
{
Console.Out.WriteLine("Selecting...");
Parent parent = (Parent) session.Get(typeof (Parent), new Guid("4bef7acb-bdae-4dd0-ba1e-9c7500f29d47"));
id = parent.Id;
lastModified = parent.LastModified + 1; // ensure the detached version used later is equal to the persisted version
Console.Out.WriteLine("Adding Child...");
Child child = (from c in session.Linq<Child>() select c).First();
parent.AddChild(child, 0m);
session.Flush();
session.Dispose(); // not needed i know
}
// attach a parent, then save with no Children
using (ISession session = Store.Local.Get<ISessionFactory>("SessionFactory").OpenSession())
{
Parent parent = new Parent("Test");
parent.Id = id;
parent.LastModified = lastModified;
session.Update(parent);
session.Flush();
}
}
Je suppose que le fait que le produit a été mis à jour sans enfants dans sa collection - les enfants seraient supprimés dans la table Parent_Child. Les problèmes semblent être liés à l'attachement du produit à la nouvelle session? Comme la cascade est définie sur all-delete-orphelin, je suppose que les modifications apportées à la collection seront propagées aux entités/tables pertinentes. Dans ce cas supprime?
Qu'est-ce qui me manque ici?
C
Quel est le type de liste d'enfants dans votre classe parente? – Beatles1692
Pouvez-vous poster la solution à votre problème? Dire simplement que vous l'avez réglé n'est pas utile. –
Je suis confronté à un problème similaire et je n'ai pas réussi à le résoudre. Pouvez-vous fournir les détails de la façon dont vous avez résolu ce problème? S'il vous plaît! – skrishna