2010-11-29 2 views
3

J'ai une base de données avec une table ProbateCases et une table de propriétés. La table Properties possède une clé étrangère à la table ProbateCases appelée ProbateCaseId, de sorte que la relation entre ProbateCases et Properties est un-à-plusieurs.NHibernate fluide: champ de clé étrangère non défini dans une association unidirectionnelle

Ma couche de domaine a une classe ProbateCase et une classe Property. La classe ProbateCase possède une collection de propriétés définies comme suit:

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; 
    } 

La partie correspondante du mappage Fluent NHibernate ressemble à ceci:

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

Notez que l'association est unidirectionnelle - la classe ProbateCase a une collection de propriétés, mais la classe Property n'a pas de membre ProbateCase.

Je trouve que l'interrogation fonctionne correctement - NHibernate crée le SQL approprié pour obtenir des propriétés avec la valeur ProbateCaseId appropriée.

Cependant, lorsque je sauvegarde un ProbateCase auquel j'ai ajouté une nouvelle propriété, le SQL INSERT ne contient PAS de valeur pour le champ de clé étrangère - donc une exception SQL se plaint d'une valeur NULL dans la clé étrangère:

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

dois-je attendrons NHibernate pour remplir la valeur de clé étrangère elle-même, ou est-il autre chose que je devrais faire?

Répondre

2

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

Very Important Note: Si la colonne d'une association est déclarée NOT NULL, NHibernate peut provoquer des violations de contraintes lorsqu'il crée ou met à jour l'association. Pour éviter ce problème, vous devez utiliser une association bidirectionnelle avec la fin évaluée (l'ensemble ou le sac) marquée comme inverse = "true". Voir la discussion sur les associations bidirectionnelles plus loin dans ce chapitre.

+0

Merci Diego. J'ai déjà vu ça mais ça n'avait pas vraiment de sens pour moi. Ce n'est pas une question de savoir si le champ FK est nullable. J'ai besoin que le champ soit défini par NHibernate et ce n'est pas le cas. Je ne sais pas pourquoi. Quoi qu'il en soit, je l'ai déjà corrigé (comme indiqué) en rendant l'association bidirectionnelle, mais c'est un hack car cela n'a pas vraiment de sens sur le plan sémantique de pouvoir accéder à la ProbateCase à partir de la propriété. – David

+3

Si cela vous fait vous sentir mieux, * tout le monde * pense que cela devrait fonctionner sans le rendre bidirectionnel (et je comprends qu'il a travaillé dans Java Hibernate pendant un certain temps). C'est juste une limitation de l'implémentation actuelle. –

+0

Merci pour la clarification. Pour le bénéfice des autres lecteurs, vous pouvez faire des associations unidirectionnelles dans NHibernate, mais seulement de l'une des deux manières possibles. Vous devez faire l'association «Classe A avec une classe B» et non avec l'association «Classe B avec plusieurs classes». – David

Questions connexes