2010-11-29 4 views
3

Ich habe eine Datenbank mit einer ProbateCases-Tabelle und einer Properties-Tabelle. Die Properties-Tabelle hat einen Fremdschlüssel für die ProbateCases-Tabelle mit dem Namen ProbateCaseId. Daher ist die Beziehung zwischen ProbateCases und Properties eins zu viele.Fluent NHibernate: Fremdschlüsselfeld wird nicht in unidirektionaler Zuordnung festgelegt

Meine Domänenebene hat eine ProbateCase-Klasse und eine Property-Klasse. Die ProbateCase Klasse eine Sammlung von Eigenschaften hat wie folgt definiert:

private IList<Property> _properties = new List<Property>(); 
public virtual IEnumerable<Property> Properties { get { return _properties; } } 
public virtual Property AddProperty() 
    { 
     Property property = new Property(); 
     _properties.Add(property); 
     return property; 
    } 

Der entsprechende Teil der Fluent NHibernate-Mapping wie folgt aussieht:

HasMany(x => x.Properties).Where("Deleted = 0").KeyColumn("ProbateCaseId").Cascade.All().Access.CamelCaseField(Prefix.Underscore); 

Beachten Sie, dass der Verein unidirektional ist - die ProbateCase Klasse ein Sammlung von Eigenschaften, aber die Property-Klasse hat kein ProbateCase-Mitglied.

Ich finde, dass Abfragen gut funktioniert - NHibernate erstellt das entsprechende SQL, um Eigenschaften mit dem entsprechenden ProbateCaseId-Wert zu erhalten.

Wenn ich jedoch ein ProbateCase speichern, zu dem ich eine neue Eigenschaft hinzugefügt habe, enthält die INSERT SQL KEINEN Wert für das Fremdschlüsselfeld - so bekomme ich eine SQL-Ausnahme, die über einen NULL-Wert im Fremdschlüssel klagt:

INSERT INTO AdminOverview.Properties (PropertyName) VALUES ('Name of property') -- Where the hell is the ProbateCaseId field value??? 

sollte ich NHibernate erwarten den Fremdschlüsselwert selbst zu füllen, oder gibt es etwas anderes sollte ich tun?

Antwort

2

Von http://nhibernate.info/doc/nh/en/index.html#collections-onetomany:

Sehr Wichtiger Hinweis: Wenn die Spalte eines Vereins NOT NULL deklariert ist, NHibernate Verletzungen Einschränkung verursachen kann, wenn es erstellt oder die Zuordnung aktualisiert. Um dieses Problem zu vermeiden, müssen Sie eine bidirektionale Verknüpfung mit dem vielwertigen Ende (dem Satz oder dem Beutel) verwenden, das als inverse = "true" gekennzeichnet ist. Weitere Informationen zu bidirektionalen Zuordnungen finden Sie weiter unten in diesem Kapitel.

+0

Dank Diego. Ich habe das schon mal gesehen, aber es ergab für mich keinen Sinn. Es ist nicht eine Frage, ob das FK-Feld nullfähig ist. Ich brauche das Feld von NHibernate festgelegt werden und es ist nicht. Ich weiß nicht warum. Wie auch immer, ich habe es bereits korrigiert (wie angegeben), indem ich die Assoziation bidirektional gemacht habe, aber es ist ein Hack, weil es semantisch keinen Sinn macht, von der Eigenschaft auf das ProbateCase zuzugreifen. – David

+3

Wenn Sie sich besser fühlen, denkt * jeder *, dass dies funktionieren sollte, ohne es bidirektional zu machen (und ich verstehe, dass es eine Weile in Java Hibernate funktioniert hat). Es ist nur eine Einschränkung der aktuellen Implementierung. –

+0

Danke für die Klarstellung. Zum Nutzen anderer Leser können Sie in NHibernate unidirektionale Verknüpfungen verwenden, jedoch nur auf EINE der beiden möglichen Arten. Sie müssen die Zuordnung "Klasse A hat eine Klasse B" durchführen, nicht die Zuordnung "Klasse B hat viele Klassen als". – David

Verwandte Themen