Fluent NHibernate: Jak stworzyć dwukierunkowe mapowanie jeden do wielu?

Podstawowe pytanie: Jak utworzyć dwukierunkową mapę jeden do wielu w płynnym NHibernate?

Szczegóły:

Mam obiekt rodzica z wieloma dziećmi. W moim przypadku nie ma znaczenia, aby dziecko nie miało rodzica, więc w bazie danych chciałbym, aby klucz obcy rodzica nie miał ograniczenia NULL. Automatycznie generuję swoją bazę danych z płynnego mapowania NHibernate.

Mam rodzica z wieloma obiektami potomnymi, takimi jak więc:

public class Summary
{
   public int id {get; protected set;}

   public IList<Detail> Details {get; protected set;}
}

public  class Detail
{
   public int id {get; protected set;}

   public string ItemName {get; set;}

  /* public Summary Owner {get; protected set;} */ //I think this might be needed for bidirectional mapping?
}

Oto mapowanie, od którego zacząłem:

public class SummaryMap : ClassMap<Summary>
{
    public SummaryMap()
    {
        Id(x => x.ID);

        HasMany<Detail>(x => x.Details);
    }
}

public class DetailMap : ClassMap<Detail>
{
    public DetailMap()
    {
        Id(x => x.ID);

        Map(x => x.ItemName).CanNotBeNull();
    }
}

W tabeli Detail Summary_id nie powinno być Null, ponieważ w moim przypadku bez znaczenia jest posiadanie przedmiotu szczegółowego nie dołączonego do obiekt summary. Jednak samo użycie Mapy HasMany() pozostawia klucz obcy Summary_id nullable.

Znalazłem w NHibernate docs ( http://www.hibernate.org/hib_docs/nhibernate/html/collections.html ), że " jeśli rodzic jest wymagany, użyj dwukierunkowego Stowarzyszenie jeden do wielu".

Więc jak utworzyć dwukierunkową mapę jeden do wielu w płynnym NHibernate?

Author: Nathan, 2008-11-22

1 answers

Aby uzyskać dwukierunkowe skojarzenie z nie-null kolumną klucza obcego w tabeli szczegółów, możesz dodać sugerowaną właściwość Owner, a References (...).Cannotbenull () mapuje w klasie DetailsMap i powoduje odwrotne zakończenie podsumowania.

Aby uniknąć posiadania dwóch różnych kolumn z kluczem obcym dla dwóch kierunków asocjacji, możesz podać nazwy kolumn ręcznie lub nazwać właściwości w sposób, który daje tę samą nazwę kolumny dla obu kierunków. W tym przypadku sugeruję zmiana nazwy szczegółów.Własność właściciela do szczegółów.Podsumowanie.

Zrobiłem summary id generowane przez increment, aby uniknąć problemów podczas wstawiania do tabeli, ponieważ summary currenty nie ma kolumn poza id.

Domena:

public class Detail
{
    public int id { get; protected set; }
    public string ItemName { get; set; }

    // Renamed to use same column name as specified in the mapping of Summary.Details
    public Summary Summary {get; set;} 
}

public class Summary
{
    public Summary()
    {
        Details = new List<Detail>();
    }

    public int id { get; protected set; }
    public IList<Detail> Details { get; protected set; }
}

Mapowanie:

public class DetailMap : ClassMap<Detail>
{
    public DetailMap()
    {
        Id(x => x.id)
            .GeneratedBy.Native();

        Map(x => x.ItemName)
            .CanNotBeNull();

        References<Summary>(x => x.Summary)
            // If you don't want to rename the property in Summary,
            // you can do this instead:
            // .TheColumnNameIs("Summary_id")
            .CanNotBeNull();
    }
}

public class SummaryMap : ClassMap<Summary>
{
    public SummaryMap()
    {
        Id(x => x.id)
            .GeneratedBy.Increment();

        HasMany<Detail>(x => x.Details)
            .IsInverse()
            .AsBag(); // Use bag instead of list to avoid index updating issues
    }
}
 54
Author: Erik Öjebo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-22 09:36:47