Próbuję ustawić związek w następujący sposób. Każdy Mistrz pozycja ma jeden lub więcej detal elementy:Konfiguracja NHibernate dla jednokierunkowej relacji jeden-do-wielu
public class Detail {
public virtual Guid DetailId { get; set; }
public virtual string Name { get; set; }
}
public class Master {
public virtual Guid MasterId { get; set; }
public virtual string Name { get; set; }
public virtual IList<Detail> Details { get; set; }
}
i mapowania:
public class MasterMap : ClassMap<Master>
{
public MasterMap()
{
Id(x => x.MasterId);
Map(x => x.Name);
HasMany(x => x.Details).Not.KeyNullable.Cascade.All();
}
}
public class DetailMap : ClassMap<Detail>
{
public DetailMap()
{
Id(x => x.Id);
Map(x => x.Name);
}
}
tabela bazie Master to:
masterId uniqueidentifier NOT NULL
name nvarchar(max) NULL
i Szczegóły jest:
DetailId uniqueidentifier NOT NULL
name nvarchar(max) NULL
MasterId uniqueidentifier NULL
foreign key (masterId) references [Master]
Nie bardzo zależy mi na łączu z Szczegóły z powrotem do Mistrza - w innych słowach, Obiekty szczegółowe same w sobie nie są interesujące dla mojej warstwy domeny. Będą one zawsze dostępne za pośrednictwem ich obiektu głównego.
Korzystanie kod tak:
Master mast = new Master
{
MasterId = new Guid(),
Name = "test",
Details = new List<Detail>
{
new Detail { .DetailId = new Guid(), .Name = "Test1" },
new Detail { .DetailId = new Guid(), .Name = "Test1" }
}
};
using (transaction == Session.BeginTransaction)
{
Session.Save(mast);
transaction.Commit();
}
Działa to doskonale, z wyjątkiem szalony ograniczenia przedstawionej w this post: NHibernate robi INSERT i stawia Detail.MasterId jako NULL, potem robi aktualizację ustawić go prawdziwy MasterId.
Naprawdę, nie chcę szczegółowych wpisów z NULL MasterIds, więc jeśli ustawię pole MasterId na NOT NULL, INSERT to Detail nie powiedzie się, ponieważ jak powiedziałem NHibernate próbuje umieścić w MasterId = NULL.
Chyba moje pytanie sprowadza się do tego:
Jak mogę uzyskać powyższy przykładowy kod do pracy z moim istniejącego modelu domeny (na przykład bez dodawania właściwość Detail.Master), a pole Detail.MasterId w bazie danych ustawionej na NOT NULL?
Czy istnieje sposób, aby Nhibernate po prostu wstawił prawidłowy identyfikator MasterId w początkowym INSERT, zamiast uruchamiać później AKTUALIZACJĘ? Czy istnieje uzasadnienie dla tej decyzji projektowej? - Walczę, aby zobaczyć, dlaczego tak się stanie.
czytałem, ale to naprawdę nie ma niczego wyjaśniać (nie ma dyskusji stowarzyszeń dwukierunkowych odwołanie). Czy istnieje uzasadnienie dla tej decyzji? Czy jest to ograniczenie projektu nhibernate? Czy to błąd? Jako stosunkowo początkujący użytkownik nhibernate, a nie znając w ogóle elementów wewnętrznych, wydaje się, że to powinno być możliwe. – gregmac
Szczerze mówiąc, nie wiem. Nie jest klasyfikowany jako błąd przez zespół NHibernate, to tylko efekt uboczny tego, jak NHibernate utrzymuje istoty. Nie będę udawał, że znam przyczyny, ale wyobrażam sobie, że ma to coś wspólnego z agnostyką bazy danych i tożsamości. –
Faktycznie, jeśli ustawiono inverse = "false" i not-null na kluczu NH3 i wyższym, wykonamy tylko dwie insercje bez wstawki-insert-update – hazzik