Ich versuche, eine Beziehung wie folgt einzurichten. Jeder Meister Artikel hat eine oder mehrere Details Artikel:NHibernate-Konfiguration für unidirektionale Eins-zu-viele-Beziehung
public class Detail {
public virtual Guid DetailId { get; set; }
public virtual string Name { get; set; }
}
public class Master {
public virtual Guid MasterId { get; set; }
public virtual string Name { get; set; }
public virtual IList<Detail> Details { get; set; }
}
und Mappings:
public class MasterMap : ClassMap<Master>
{
public MasterMap()
{
Id(x => x.MasterId);
Map(x => x.Name);
HasMany(x => x.Details).Not.KeyNullable.Cascade.All();
}
}
public class DetailMap : ClassMap<Detail>
{
public DetailMap()
{
Id(x => x.Id);
Map(x => x.Name);
}
}
Die Meister Datenbanktabelle ist:
masterId uniqueidentifier NOT NULL
name nvarchar(max) NULL
und Details ist:
DetailId uniqueidentifier NOT NULL
name nvarchar(max) NULL
MasterId uniqueidentifier NULL
foreign key (masterId) references [Master]
Ich weiß nicht wirklich eine Verbindung von Details zu haben, zurück zu Meister - in anderen Worten, Detail Objekte auf ihrem eigenen sind einfach nicht interessant zu meiner Domain-Schicht. Sie werden immer über ihr Master-Objekt zugreifen.
Mit Code wie folgt:
Master mast = new Master
{
MasterId = new Guid(),
Name = "test",
Details = new List<Detail>
{
new Detail { .DetailId = new Guid(), .Name = "Test1" },
new Detail { .DetailId = new Guid(), .Name = "Test1" }
}
};
using (transaction == Session.BeginTransaction)
{
Session.Save(mast);
transaction.Commit();
}
Dies funktioniert gut, mit Ausnahme einer verrückten Einschränkung in this post umrissen: NHibernate hat eine INSERT und legt Detail.MasterId als NULL zuerst, dann wird ein UPDATE es auf die echte MasterId.
Wirklich, ich will keine Detaileinträge mit NULL MasterIds, wenn ich das MasterId Feld auf NOT NULL gesetzt habe, wird INSERT to Detail fehlschlagen, weil, wie gesagt, NHibernate versucht, MasterId = NULL zu setzen.
Ich denke, meine Frage dazu läuft darauf hinaus:
Wie kann ich die obige Code Probe bekommen mit meinem vorhandenen Domänenmodell zu arbeiten (zB ohne eine Detail.Master Eigenschaft hinzufügen), und das Detail.MasterId Feld in der Datenbank auf NOT NULL gesetzt?
Gibt es eine Möglichkeit, Nhibernate dazu zu bringen, einfach die richtige MasterId in die anfängliche INSERT zu schreiben, anstatt ein UPDATE danach auszuführen? Gibt es Gründe für diese Designentscheidung? - Ich habe Mühe zu sehen, warum es so gemacht wird.
ich habe gelesen das, aber es hat nicht wirklich etwas erklären (ebenso wenig wie die Diskussion über bidirektionale Verbände verwiesen). Gibt es Gründe für diese Entscheidung? Ist es eine Design-Beschränkung von Nhibernat? Ist es ein Fehler? Als relativ Neuling zu Nhibernate, und nicht zu wissen, die Interna überhaupt, scheint es so, als ob dies möglich sein sollte. – gregmac
Ehrlich gesagt, weiß ich nicht. Es wird vom NHibernate-Team nicht als Fehler eingestuft, es ist nur ein Nebeneffekt davon, wie NHibernate Entitäten persistiert. Ich werde nicht so tun, als wüsste ich die Gründe, aber ich stelle mir vor, dass es etwas damit zu tun hat, unabhängig von Datenbank und Identity Generator zu sein. –
Eigentlich, wenn inverse = "false" und nicht-null auf Schlüssel NH3 und höher wird nur zwei Inserts insert von insert-insert-update – hazzik