NHibernate Force Guid поколения при вставке коллекции - PullRequest
0 голосов
/ 20 февраля 2012

Я хочу добавить новый объект в мой общий корень.Это работает нормально, но не вызывает генерацию идентификатора.

Чтобы сделать это более понятным, возьмем следующий пример кода, где все сущности сопоставлены с Id(e => e.Uid).GeneratedBy.GuidComb();.

public class Aggregate : EntityBase<Guid,Aggregate>
{
   // ...
   public virtual ISet<SubEntity> SubEntities { get; protected set; }

   public virtual SubEntity DoSomethingThatCreatesASubEntity(string name, string format)
   {
       var newEntity=new SubEntity(name, format);
       SubEntities.Add(newEntity);
       return newEntity;
   }
}
public class SubEntity : EntityBase<Guid,SubEntity>
{
}
// Client Code:
var agr=Session.Get<Aggregate>(id);
var subEntity=agr.DoSomethingThatCreatesASubEntity("xyz","xyz");
Assert.True(subEntity.IsTransient);
Session.Flush();
Assert.False(subEntity.IsTransient);

Что я хочу, так это то, что когда я добавляю к SubEntites, newEntity будет перезагружаться с Uid.Я не хочу получать доступ к NHibernate ISession там (поэтому Session.Save () или Refresh ()) недоступны.

Возможно ли это без изменения моих сущностей?

Ответы [ 2 ]

0 голосов
/ 20 февраля 2012

Вы можете генерировать идентификаторы вручную (установить генератор идентификаторов для назначения), затем каждый раз, когда вы создаете новую сущность, вы должны установить ее идентификатор, и у вас будет этот идентификатор доступным в вашем приложении без использования ISession. Позже вы можете использовать ISession, чтобы сохранить этоОбъект в базу данных. Единственная проблема этого подхода в том, что NHibernate не имеет понятия, какой объект создается и какой объект обновляется (вы не можете использовать метод сеанса SaveOrUpdate), вы должны либо явно использовать методы Save и Update, либо можетевставьте перехватчик, который использует логику, чтобы увидеть, обновляется или вставляется объект, и затем вы можете снова использовать SaveOrUpdate.

0 голосов
/ 20 февраля 2012

Я думаю, у вас есть два варианта:

  1. Назначьте идентификатор вручную перед сохранением.В этом случае NHibernate не сможет обнаружить, что это новый объект, если вы не добавите столбец Version или Timestamp. Смотрите здесь .

  2. Вернуть сам SubEntity из вашего метода (в конце концов, в DDD, почему вы хотите передать GUID?) Все, что содержит ссылку на эту суб-сущность, получитпоследний идентификатор после сохранения совокупного корня в конце сеанса.Предположительно, сеанс будет сброшен до того, как управление вернется к внешнему коду, где и будет нужен идентификатор, но при вызове кода необходимо знать, что извлечение идентификаторов в середине сеанса - плохая идея.

...