NHibernate Fluido: clave externa no nula problema
-
12-09-2019 - |
Pregunta
Tengo las siguientes clases de 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; }
}
he hecho la clase base Entidad según la siguiente después . He definido las siguientes asignaciones:
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").Cascade.All();
}
}
Al ejecutar el siguiente código:
Installation installation = TestHelper.CreateAnonymousInstallation();
installation.Institutions.Add(TestHelper.CreateAnonymousInstitution());
installation.Institutions.Add(TestHelper.CreateAnonymousInstitution());
session.Save(installation);
Me sale el siguiente error:
NHibernate.PropertyValueException: propiedad no nulo hace referencia a una nula o valor transitoria.
¿Cómo superar el problema?
Gracias de antemano Lukasz Glaz
Solución
Como puedo ver tu clase Institución tiene referencia sobre la clase de instalación. Y esta referencia está configurado para no nulo. Cuando se crea AnonymousInstitution hacer configura alguna instalación para ello?
Otros consejos
Creo que es inversa = cierto que se necesita.
HasMany<Institution>(i => i.Institutions)
.KeyColumnNames.Add("InstallationId")
.Cascade.All()
.Inverse();
O, por supuesto, añadir un método en la clase de instalación de manejar esto de manera explícita.
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 virtual void AddInstitution(Institution entity)
{
entity.Installation = this;
Institutions.Add(entity);
}
}