Fluent NHibernate: Fremdschlüssel nicht null Problem
-
12-09-2019 - |
Frage
Ich habe folgende Domain-Klassen:
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; }
}
Ich habe die Entity Basisklasse nach folgendem post . Ich habe folgende Zuordnungen definiert:
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();
}
}
Wenn ich den folgenden Code:
Installation installation = TestHelper.CreateAnonymousInstallation();
installation.Institutions.Add(TestHelper.CreateAnonymousInstitution());
installation.Institutions.Add(TestHelper.CreateAnonymousInstitution());
session.Save(installation);
Ich erhalte den folgenden Fehler:
NHibernate.PropertyValueException: nicht-Null-Eigenschaft verweist auf eine Null oder transienter Wert.
Wie das Problem zu überwinden?
Vielen Dank im Voraus Lukasz Glaz
Lösung
Wie ich Ihre Institution Klasse sehen Bezug auf Installationsklasse. Und dieser Hinweis wird auf nicht null. Wenn Sie AnonymousInstitution schaffen tun Sie es einige Einbauset?
Andere Tipps
Ich glaube, es ist invers = true, was benötigt wird.
HasMany<Institution>(i => i.Institutions)
.KeyColumnNames.Add("InstallationId")
.Cascade.All()
.Inverse();
oder natürlich eine Methode in der Installationsklasse hinzufügen, dies ausdrücklich zu behandeln.
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);
}
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow