2010-02-09 2 views
0

я сделать следующее:Каскад NHibernate и генерируемые подсказки - почему они не генерируются для детей при сохранении?

var @case = new Case 
    { 
     Name = "test" 
    }; 

    // User is persistent and loaded in the same session 
    User.AddCase(@case); // sets @case.User = User too 
    Session.Update(User); 

    response.CaseId = @case.Id; 

каскад на User.Cases устанавливается на все. Но @ case.Id не установлен, пока транзакция не будет выполнена. Это ожидаемое поведение? Я очень хотел бы получить идентификатор перед совершением. Это можно сделать?

+0

И следует упомянуть, что я использую сгенерированный guid.comb для идентификаторов. Если я выполняю Session.Save (@case), он генерирует идентификатор просто отлично, но мне интересно, почему это не происходит, когда он каскадирует. – asgerhallas

+0

Что такое каскадный набор? – hackerhasid

+0

«Каскад на User.Cases установлен на« Все ». :) – asgerhallas

ответ

0

Вы пробовали Session.SaveOrUpdate(User)? Хотя я должен сказать, что каскадные операции не выполняются до тех пор, пока это не понадобится, и это произойдет при сбое/фиксации. когда вы Session.Save(@case) вы не промываете/совершаете

Сказав, что вы делаете логическую ошибку: , создав @case, вы не обновляете пользователя. Пользователь представляет собой отдельный объект, а Case имеет внешний ключ для пользователя. Поэтому сохранение Дела собственно, и список случаев Пользователь просто информация

+0

Извините за поздний ответ на этот ответ. По какой-то причине я не видел уведомления. – asgerhallas

+0

Просто, чтобы быть ясным, если я использую Session.Save (@case), это сработает, но я ищу более чистый DDD-интерфейс. Поэтому ваш ответ о том, что «каскадные операции не выполняются до тех пор, пока это не понадобится, и что происходит при флеше/фиксации», делает это невозможным. – asgerhallas

+0

Что касается вашего последнего абзаца. С точки зрения OO, вы не правы, и я хочу, чтобы это было как можно меньше реляционных. С точки зрения РСУБД вы правы, но именно поэтому я использую каскадирование. Когда я обновляю User, я хочу, чтобы NH обновляла (или сохраняла) любой случай в коллекции. Я забочусь о ссылке внешнего ключа в методе AddCase, чтобы абстрагироваться от реляционной части. Он отлично работает, за исключением того, что каскадирование слишком поздно, поэтому я не получаю идентификаторы, пока не стало слишком поздно. – asgerhallas

1

ассоциации Более чистый DDD'y Филей вещь, вероятно, будет моделировать как User и Case как совокупности корней, а затем моделировать свои отношения с ролью объект RelatedCase (он агрегирован внутри User и, следовательно, должен быть каскадом = «все-удалить-сирота»).

Совокупные корни должны быть сохранены в репозиториях, которые (если вы делегируете вызов session.Save(...)) предоставят вам необходимый вам идентификатор в то время, когда вы можете его использовать.

Тогда роль может (и по моему опыту часто будет, по крайней мере, через некоторое время) содержать дополнительную информацию, которая характеризует отношения, и не принадлежит ни к ни пользователю, ни к делу. Предположим, что отношения отслеживают, почему пользователь и случай связаны.

Таким образом, ваш код может выглядеть следующим образом:

var case = caseFactory.Create("name"); 
caseRepository.Save(case); 

user.AssignCase(case, "Assigned by some dude"); 

-И внутри AddCase:

public void AddCase(Case case, string reason) 
{ 
    cases.Add(new RelatedCase(case, reason)); 
} 

Это на мой взгляд, самый красивый способ модель такого рода вещи, но вы будете конечно, можно оштрафовать немного по производительности. Если для вас важнее симпатичная модель, вам нужно пойти на что-то подобное.

+0

Спасибо! Вышеприведенный код был главным образом для примера. Реальный код делает нечто большее: User.CreateCase(), и не намного больше. И репозиторий, конечно, не приветствуется в классах домена.Моделируется после этого: http://www.udidahan.com/2009/06/29/dont-create-aggregate-roots/. Ваша мысль о моделировании отношения с объектом роли очень хорошая. Я займусь этим. – asgerhallas

+0

Но все же. Возможно, я ошибаюсь, если это не поддерживается :) – asgerhallas

+0

О, да, я предполагал, что вы находитесь в службе приложений с доступом к инъецированным услугам, таким как фабрика и репозиторий – mookid8000