Chcę dodać nową jednostkę w moim zagregowanym katalogu głównym. Działa to dobrze, ale nie wymusza generowania identyfikatora.

Aby było to bardziej przejrzyste, weź poniższy przykładowy kod, w którym wszystkie Encje są mapowane za pomocą 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);

To, czego chcę, to to, że kiedy dodam do SubEntites, newEntity zostanie ponownie załadowany z Uid. Nie chcę uzyskać dostępu do NHibernate ISession tam (więc Session.Save() lub Refresh()) są poza zasięgiem.

Czy jest to możliwe bez modyfikowania moich jednostek?

0
sanosdole 20 luty 2012, 20:19

2 odpowiedzi

Najlepsza odpowiedź

Myślę, że masz dwie opcje:

  1. Przypisz identyfikator ręcznie przed zapisaniem. W takim przypadku NHibernate nie będzie w stanie wykryć, że jest to nowa jednostka, chyba że dodasz kolumnę Version lub Timestamp. Zobacz tutaj.

  2. Zwróć sam SubEntity ze swojej metody (w końcu w DDD, dlaczego chcesz przekazywać identyfikatory GUID?) Wszystko, co ma odniesienie do tego podobiektu, otrzyma najnowszy identyfikator, gdy zagregowany root zostanie zapisany w koniec sesji. Przypuszczalnie sesja zostanie opróżniona, zanim kontrola przejdzie z powrotem do kodu front-endu, gdzie identyfikator będzie potrzebny, ale kod wywołujący musi mieć świadomość, że wyodrębnianie identyfikatorów w połowie sesji jest złym pomysłem.

0
Community 23 maj 2017, 14:48

Możesz wygenerować identyfikatory ręcznie (ustaw generator identyfikatorów do przypisania), wtedy za każdym razem, gdy tworzysz nową encję, powinieneś ustawić jej id, a będziesz miał ten identyfikator dostępny w swojej aplikacji bez użycia ISession. Później możesz użyć ISession, aby zapisać ten obiekt w bazie danych .Jedynym problemem związanym z tym podejściem jest to, że NHibernate nie będzie miał pojęcia, który obiekt jest tworzony, a który aktualizowany (nie możesz użyć metody sesji SaveOrUpdate) powinieneś użyć metod Save i Update lub możesz wstawić interceptor które używają logiki, aby sprawdzić, czy obiekt jest aktualizowany lub wstawiany, a następnie możesz ponownie użyć SaveOrUpdate.

0
Beatles1692 20 luty 2012, 20:30