Domanda

Ho un problema con relazioni uno-a-molti. Ho le seguenti classi di dominio:

public class Installation : Entity<Installation>
{        
    public virtual string Name { get; set; }
    public virtual IList<Institution> Institutions { get; set; }

    public Installation()
    {
        Institutions = new List<Institution>();
    }
}
public class Institution : Entity
{
    public virtual string Name { get; set; }
    public virtual string Address { get; set; }
    public virtual string City { get; set; }
    public virtual Installation Installation { get; set; }        
}

Ho fatto la classe base Entity secondo il seguente posta . Ho le seguenti mappature definite:

public class InstitutionMapping : ClassMap<Institution> 
{
    public InstitutionMapping()
    {
        WithTable("Institution");
        Id(i => i.Id).GeneratedBy.Guid();
        Map(i => i.Name).Not.Nullable().WithLengthOf(50);
        Map(i => i.Address).Not.Nullable().WithLengthOf(50);
        Map(i => i.City).Not.Nullable().WithLengthOf(50);
        References(i => i.Installation).ColumnName("InstallationId").Not.Nullable().WithForeignKey();
    }
}

public class InstallationMapping : ClassMap<Installation>
{
    public InstallationMapping()
    {
        WithTable("Installation");
        Id(i => i.Id).GeneratedBy.Guid();
        Map(i => i.Name).Not.Nullable().WithLengthOf(50);
        HasMany<Institution>(i => i.Institutions).KeyColumnNames.Add("InstallationId").Inverse().Cascade.All();
    }
}

I test di unità aggiungendo le istituzioni ad un impianto nel seguente modo:

Installation installation = TestHelper.CreateAnonymousInstallation();
installation.Institutions.Add(TestHelper.CreateAnonymousInstitution());
installation.Institutions.Add(TestHelper.CreateAnonymousInstitution());
session.Save(installation);    
session.Flush();
session.Clear();
Installation returnedInstallation = session.Get<Installation>(installation.Id);
Assert.AreEqual(2, returnedInstallation.Institutions.Count);

ottengo un'eccezione affermazione, perché il numero restituito delle istituzioni è 0. Ho controllato in SQL Profiler e le istituzioni vengono salvati nel database, ma il loro InstallationID è nullo. Qualcuno potrebbe dirmi che cosa sto facendo male?

È stato utile?

Soluzione

Quando si dispone di una collezione persistente con inverse="false", allora l'oggetto padre possiede il rapporto e le eventuali modifiche alla raccolta del genitore si rifletterà nel database.

Quando si dispone di una collezione persistente con inverse="true", allora l'oggetto figlio possiede il rapporto e le eventuali modifiche di riferimento del bambino al genitore si rifletterà nel database.

A causa di impostare inverse="true", è necessario modificare il riferimento del oggetto figlio per l'oggetto padre in modo che NHibernate per prendere su di esso. Se si desidera NHibernate per salire sulle modifiche al rapporto ogni volta che si aggiungono figli o rimuovere i bambini dalla collezione del genitore, è necessario impostare inverse="false" sulla raccolta.

Altri suggerimenti

È necessario impostare manualmente la proprietà di installazione di un'Istituzione, in particolare,

Installation installation = TestHelper.CreateAnonymousInstallation();
Institution institution = TestHelper.CreateAnonymousInstitution();
institution.Installation = installation;
installation.Institutions.Add(institution);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top