2013-07-13 12 views
6

Moje pytanie brzmi, czy istnieje możliwe mapowanie Fluent NHibernate dla obiektów Parent i Child, które nie wymagają, aby obiekt Child posiadał właściwość Parent obiektu? Nie wymyśliłem, jak zmapować odniesienie z powrotem do rodzica. Kiedy wołam Utwórz z odwzorowaniami tak jak jest, otrzymuję wyjątek, ponieważ obiekt Dziecko nie ma wymaganego klucza obcego (wymagane w składnicy danych) z powrotem do jednostki nadrzędnej.Mapowanie klucza obcego w Fluent NHibernate bez właściwości obiektu

Mam dwóch klas POCO:

public class Parent 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual IList<Child> Childs { get; set; } 
} 

public class Child 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual int ParentId { get; set; } 
} 

a niektóre mapowania:

public class ParentMap : ClassMap<Parent> 
{ 
    public ParentMap() 
    { 
     this.Table("Parents"); 
     this.Id(x => x.Id); 
     this.Map(x => x.Name); 
     this.HasMany(x => x.Childs).KeyColumn("ChildId").Cascade.AllDeleteOrphan(); 
    } 
} 

public class ChildMap : ClassMap<Child> 
{ 
    public ChildMap() 
    { 
     this.Table("Childs"); 
     this.Id(x => x.Id); 
     this.Map(x => x.Name); 
     // Needs some sort of mapping back to the Parent for "Child.ParentId" 
    } 
} 

I Tworzenie metody:

public Parent Create(Parent t) 
{ 
    using (this.session.BeginTransaction()) 
    { 
     this.session.Save(t); 
     this.session.Transaction.Commit(); 
    } 
    return t; 
} 

Chcę móc utworzyć obiekt nadrzędny, ma listę obiektów podrzędnych, ale nie ma obiektów podrzędnych, które odwołują się do swojego nadrzędnego (innego niż identyfikator rodzica). Chcę to zrobić, aby uniknąć odwołania cyklicznego z Parent do listy Childs z powrotem do obiektu Parent, ponieważ powoduje to problemy z serializacją JSON.

+0

Czy odwzorowanie właściwości nadrzędnej (w polu "Dziecko") na pole prywatne jest opcją? –

+0

To właśnie robię, chociaż staram się tego uniknąć, ponieważ nie mogę wtedy uruchamiać zapytań w właściwości 'ParentId'. Wygląda na to, że powinienem móc odwzorować właściwość z ograniczeniem klucza obcego do kolumny bez wymagania obiektu ... –

+0

W przypadku pierwotnego pytania odpowiedź Felipe jest poprawna. Nie serializuj bezpośrednio obiektów, przekształć je najpierw w DTO lub ViewModel, otrzymując najpierw dokładnie taką strukturę, jaką chcesz. –

Odpowiedz

3

Można mapować tych podmiotów bez problemu, spróbuj tego:

public class ParentMap : ClassMap<Parent> 
{ 
    public ParentMap() 
    { 
     this.Table("Parents"); 
     this.Id(x => x.Id); 
     this.Map(x => x.Name); 
     this.HasMany(x => x.Childs).KeyColumn("ChildId").Cascade.AllDeleteOrphan(); 
    } 
} 

public class ChildMap : ClassMap<Child> 
{ 
    public ChildMap() 
    { 
     this.Table("Childs"); 
     this.Id(x => x.Id); 
     this.Map(x => x.Name); 
     this.Map(x => x.ParentId); 
     // if you have a reference of Parent object, you could map as a reference, for sample: 
     this.References(x => x.Parent).Column("ParentId"); 
    } 
} 

Gdy pojawi się podmioty z ISession nie szeregować je do jakiegoś formatu, ponieważ mogą one być pełnomocnikami NHibernate zamiast jednostek obiektów. Spróbuj utworzyć DTO (Data Transfer Object) classes i przekonwertuj te obiekty na obiekt DTO i przekształć go do postaci szeregowej. Unikasz odwołań cyklicznych. Dla próbki:

public class ParentDTO 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int ParentId { get; set; } 

    /* here you just have the primitive types or other DTOs, 
     do not reference any Entity type*/ 
} 

a kiedy trzeba odczytać wartości podzielić wartość odcinkach:

var dto = ISession.Query<Parent>() 
        .Select(x => 
         new ParentDTO() { 
          Id = x.Id, 
          Name = x.Name, 
          ParentId = x.ParentId) 
        .ToList(); 

uzyskać ten rezultat z warstwy dostępu do danych i spróbować szeregować, dla próbki:

var result = Serialize(dto); 
+1

Najważniejsze dla mnie, że twoja odpowiedź nie adresuje, właściwość 'ParentId' musi mieć ograniczenie klucza obcego w własności' Id' obiektu 'Parent'. Po prostu "Mapuj" to, więc nie ma w ogóle żadnych ograniczeń. –

+0

Zgadzam się z tobą @PatrickQuirk, ale w modelu, który podany OP nie ma odniesienia, po prostu "Id". –

Powiązane problemy