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?
2 odpowiedzi
Myślę, że masz dwie opcje:
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
lubTimestamp
. Zobacz tutaj.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.
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.
Podobne pytania
Powiązane pytania
Nowe pytania
c#
C # (wymawiane „patrz ostro”) jest językiem programowania wysokiego poziomu, statycznie typowanym, wieloparadygmatowym opracowanym przez firmę Microsoft. Kod C # zwykle jest przeznaczony dla rodziny narzędzi Microsoft .NET i czasów wykonywania, do których należą między innymi .NET Framework, .NET Core i Xamarin. Użyj tego tagu w przypadku pytań dotyczących kodu napisanego w C # lub C # formalnej specyfikacji.