NHibernate: Нарушено ненулевое ограничение при сохранении отношения HasMany с Cascade = AllDeleteOrphan - PullRequest
0 голосов
/ 10 марта 2010

Мой боб выглядит так:

public class A {  
    ...  
    [HasMany (MapType = typeof(B), Table = "B_table", ColumnKey = "A_object_id",  
              Fetch = FetchEnum.Join,  
              RelationType = RelationType.List, Index = "id",  
              Cascade = ManyRelationCascadeEnum.AllDeleteOrphan)]

    IList<B> BList { get; set; }
    ...
}

и при выполнении Save на этом бине я ожидаю, что бины типа B будут автоматически сохранены (и удалены при обновлении) тоже. NHibernate, конечно, пытается это, но это так с B_table.A_object_id, установленным сначала в NULL, а затем NHibernate обновляет B_table, устанавливая правильное значение B_table.A_object_id (то есть: A.ID). Это не то, что я хочу, так как у меня есть ограничение NOT NULL в базе данных.
Мой вопрос: как заставить NHibernate автоматически сохранять дочерние объекты с правильным идентификатором, установленным с самого начала? Я знаю, что могу создать компонент A, сохранить его, получить новый идентификатор, создать компоненты B, установить их A_object_id и затем сохранить компоненты B ... но это обходной путь.

1 Ответ

0 голосов
/ 10 марта 2010

Однонаправленные отношения (в которых только родитель знает о дочернем элементе) всегда приводят к обновлению для установки идентификатора. Я не уверен, почему, и для меня это тоже не имеет большого смысла, но именно так работает NHibernate.

Вам необходимо создать двунаправленное отношение, в котором HasMany будет иметь значение Inverse = true, а B будет содержать ссылку на класс A (который должен быть заполнен при добавлении B в коллекцию A.

...