Meant to link to Stack Overflow but forgot: here is the question and
explanation<http://stackoverflow.com/questions/4468571/nhibernate-mapping-not-adding-on-delete-cascade-option-to-foreign-key-reference>I
wanted to mention.
On Thursday, May 15, 2014 6:38:48 PM UTC+2, Dawid Ciecierski wrote:
>
> Not necessarily "will never have" — it *is* possible to persuade
> NHibernate to set ON DELETE CASCADE. Have a look at this Stack Overflow
> question; if a collection is one-to-many and inverse, you can set Key(k
> => k.OnDelete(OnDeleteAction.Cascade)). My thinking was that if it's
> possible in one case, perhaps there is a way to force the same behaviour in
> an even more (IMHO) straight-forward instance.
>
> Dawid
>
> On Thursday, May 15, 2014 6:27:28 PM UTC+2, Ricardo Peres wrote:
>>
>> Meaning: if you want to have cascade actions on the database, you have to
>> add them yourself, maybe using auxiliary database objects.
>>
>> RP
>>
>> On Thursday, May 15, 2014 5:26:27 PM UTC+1, Ricardo Peres wrote:
>>>
>>> Of course it doesn't, and it will never have! Cascade actions are
>>> performed by NHibernate, not at the database level!
>>>
>>> RP
>>>
>>> On Thursday, May 15, 2014 4:50:11 PM UTC+1, Dawid Ciecierski wrote:
>>>>
>>>> Ricardo, thanks for your help but if you look closer at the resulting
>>>> database (and/or the exported schema) you'll notice that the foreign key
>>>> relationship has NO ACTION set for the ON DELETE event in the foreign key
>>>> constraint. This works fine when executing everything via NHibernate's
>>>> entity management methods, but fails when a simple DELETE is issued
>>>> against
>>>> the database.
>>>>
>>>> Dawid
>>>>
>>>> On Thursday, May 15, 2014 12:58:12 PM UTC+2, Ricardo Peres wrote:
>>>>>
>>>>> I have a similar mapping - Post and Tag - where one Post can have
>>>>> several tags, which are just strings (sorry, don't have time to change
>>>>> it):
>>>>>
>>>>> this.Set(x => x.Tags, x =>
>>>>> {
>>>>> x.Key(y =>
>>>>> {
>>>>> y.Column("post_id");
>>>>> y.NotNullable(true);
>>>>> });
>>>>> x.Cascade(Cascade.All);
>>>>> x.Lazy(CollectionLazy.NoLazy);
>>>>> x.Fetch(CollectionFetchMode.Join);
>>>>> x.Table("tag");
>>>>> }, x =>
>>>>> {
>>>>> x.Element(y =>
>>>>> {
>>>>> y.Column("tag");
>>>>> y.Length(20);
>>>>> y.NotNullable(true);
>>>>> y.Unique(true);
>>>>> });
>>>>> });
>>>>>
>>>>>
>>>>> I am using set instead of bag, this is generally better, and in your
>>>>> case, I imagine you don't want duplicate values stored.
>>>>> See if this works!
>>>>>
>>>>> RP
>>>>>
>>>>> On Thursday, May 15, 2014 11:31:13 AM UTC+1, Dawid Ciecierski wrote:
>>>>>>
>>>>>> Hello,
>>>>>>
>>>>>> Let me start by asking the moderator to please look at my previous
>>>>>> post sent around Friday (May 9), as it went into much greater detail as
>>>>>> well as linked to a sample project but for some reason was not
>>>>>> approved...
>>>>>> Would be grateful if you could look at it again as I spend a good
>>>>>> several
>>>>>> minutes describing what I'm trying to accomplish as best I could.
>>>>>>
>>>>>> Also wanted to add that this is a sister post to one on the
>>>>>> developers
>>>>>> group<https://groups.google.com/forum/#!topic/nhibernate-development/UTbygrpFz04>,
>>>>>>
>>>>>> in which I tried to go into more technical aspects of this issue, but
>>>>>> was
>>>>>> still directed to this group :-)
>>>>>>
>>>>>> Without further ado thou. What I have is frequently updated and
>>>>>> delete-d entity that is just a view on a more complex business
>>>>>> domain. Each entity in this "view" has a child collection of simple
>>>>>> strings
>>>>>> (think tags). Because of the DELETE FROM [TableName] we regularly
>>>>>> execute, I'd like to mark the foreign key relationship as ON DELETE
>>>>>> CASCADE. Right now I do so manually but only because I've found no
>>>>>> way to coerce NHibernate into seeing the relationship the same way.
>>>>>> Ultimately I'd like to find a way to do so as the whole database is
>>>>>> frequently rebuilt from scratch by SchemaExport and doing manual updates
>>>>>> to
>>>>>> multiple foreign key relationships is time-consuming. Below is a simple
>>>>>> class with its mapping demonstrating the use case:
>>>>>>
>>>>>> public class Photo
>>>>>> {
>>>>>> public int Id { get; set; }
>>>>>> public string Name { get; set; }
>>>>>> public IList<string> Tags { get; set; }
>>>>>>
>>>>>> public Photo()
>>>>>> {
>>>>>> Tags = new List<string>();
>>>>>> }
>>>>>> }
>>>>>>
>>>>>> public class PhotoMap : ClassMapping<Photo>
>>>>>> {
>>>>>> public PhotoMap()
>>>>>> {
>>>>>> Lazy(false);
>>>>>> Id(p => p.Id);
>>>>>> Property(p => p.Name);
>>>>>> Bag(
>>>>>> p => p.Tags,
>>>>>> collectionMapping: collectionMapping =>
>>>>>> {
>>>>>> //collectionMapping.Inverse(true);
>>>>>> collectionMapping.Lazy(CollectionLazy.NoLazy);
>>>>>> collectionMapping.Cascade(Cascade.All | Cascade.DeleteOrphans);
>>>>>> },
>>>>>> mapping: mapping =>
>>>>>> {
>>>>>> //mapping.OneToMany(); // NH does not like this
>>>>>> mapping.Element(e => e.Column("tag_value"));
>>>>>> });
>>>>>> }
>>>>>> }
>>>>>>
>>>>>> When I uncomment the mapping.OneToMany line NHibernate tells me that
>>>>>> there is an unmapped entity System.String, so clearly I'm going against
>>>>>> its
>>>>>> way of thinking (and on the developers' group Ricardo confirmed that
>>>>>> one-to-many is for entities only). Will be grateful for any advice on
>>>>>> how I
>>>>>> can make it work.
>>>>>>
>>>>>> Best regards,
>>>>>> Dawid Ciecierski
>>>>>>
>>>>>> Ps. I've prepared a sample project that does not make actual database
>>>>>> calls which I can link to, but will refrain myself from doing so just in
>>>>>> case linking outside of Google Groups automatically puts my post in the
>>>>>> moderator's trash.
>>>>>>
>>>>>
--
You received this message because you are subscribed to the Google Groups
"nhusers" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/nhusers.
For more options, visit https://groups.google.com/d/optout.