Hi. I posted this same topic on stack overflow but there's no been response as yet and unlikely to be one with the view count so I thought I might try asking here. I have a model with a parent class that holds a collection of subclassed children (using TablePerSubClass inheritance). When attempting to to test cascading deletes by calling delete only on the parent object I get a constraint error between the child table and its joined-subclass table. To demonstrate...
public class ParentMap : ClassMap<Parent> {
public ParentMap() {
Id(x => x.Id);
HasMany(x => x.Children)
.Cascade.AllDeleteOrphan()
.ForeignKeyCascadeOnDelete()
.Inverse();
}
}
public class ChildMap : ClassMap<Child> {
public ChildMap() {
Id(x => x.Id);
References(x => x.Parent).Not.Nullable();
}
}
public class ExtendedChildMap : SubclassMap<ExtendedChild> {
public ExtendedChildMap() {
Map(x => x.extraFeature);
}
}
To test, I'm using NUnit with my testfixture beginning a new transaction for each test setup, and rolling back the transaction for each teardown. With the following test...
using (var session = sessionFactory.OpenSession()) { using (var transaction = session.BeginTransaction()) { var p = new Parent(); var c1 = new Child() { Parent = p }; var c2 = new ExtendedChild() { Parent = p }; session.SaveOrUpdate(p); session.SaveOrUpdate(c1); session.SaveOrUpdate(c2); Assert.IsTrue(session.Query<Parent>().Count() == 1); Assert.IsTrue(session.Query<Child>().Count() == 2); Assert.IsTrue(session.Query<ExtendedChild>().Count() == 1); session.Delete(p); Assert.IsTrue(session.Query<Parent>().Count() == 0); } }
The test fails on the final assertion with
The DELETE statement conflicted with the REFERENCE constraint "FKDB46742824B330ED". The conflict occurred in database "testDB", table "dbo.ExtendedChild", column 'Child_id'
If the collection only holds the baseclass Child objects it works as expected, but when a derived ExtendedChild is added the delete doesn't seem to propogate to the baseclass. Feel like I'm missing something obvious here but I've still not managed to solve this after a good while searching.
Lastly, I'm also still not 100% clear on the functional differences between Cascade.AllDeleteOrphan and ForeignKeyCascadeOnDelete...
or more precisely (ignoring the save/update part) what is the case that
the former doesn't handle and requires the latter to be specified? TIA.
--
You received this message because you are subscribed to a topic in the Google Groups "Fluent NHibernate" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/fluent-nhibernate/JnxmzHWURBc/unsubscribe.
To unsubscribe from this group and all its topics, send an email to fluent-nhibern...@googlegroups.com.
To post to this group, send email to fluent-n...@googlegroups.com.
Visit this group at http://groups.google.com/group/fluent-nhibernate.
For more options, visit https://groups.google.com/d/optout.