2010-06-26 7 views
0

Si j'ai une classe parente:Lors du mappage automatique d'une collection avec Fluent NHibernate, comment rendre nulle la clé étrangère de l'enfant pour le parent?

public class Parent 
{ 
    public Parent() 
    { 
     Children = new List<Child>(); 
    } 

    IList<Child> Children {get; private set;} 
} 

et une classe enfant comme ceci:

public class Child 
{ 
    public SomeThirdClass Friend {get; set;} 
} 

Chaque fois que je laisse frapper ces gars-là le automapper du Courant NHibernate, il fait la classe Child un non clé étrangère nullable. J'ai modifié quelques conventions de mappage automatique et quelques substitutions pour certaines classes, mais pour cette paire particulière, seule la classe Parent a une substitution. Le remplacement ne spécifie pas comment mapper la partie de collection pour la classe Parent.

Est-ce que faire une clé étrangère non-nullable dans l'enfant d'une collection est le comportement par défaut, ou ai-je fait quelque chose?

Comment spécifier dans une classe de remplacement de mappage que la clé étrangère de l'enfant est nullable?

PAIX!

+0

veuillez poster vos correspondances. paix. – anthony

+0

Je suis loin de mon code pour le week-end, mais quand je reviendrai, je l'afficherai. THX! –

Répondre

0

j'ai pu résoudre le problème en supprimer un mappage fluide d'une 4ème classe GrandParent et permettre à l'automappeur de mapper cette classe. Avant je n'avais pas permis à l'automapper de mapper la classe GrandParent parce que j'avais une cartographie fluide de cette classe. D'une manière ou d'une autre, ce conflit entre les mappages fluides et automatiques a provoqué l'annulation de la clé étrangère dans Child.

Je ne peux pas dire que je comprends complètement ce qui s'est mal passé, donc la prudence est recommandée en suivant ma solution. Mais je peux dire que la combinaison de Mappings Fluent et Automappings augmente définitivement la complexité des problèmes de persistance de débogage.

Autre solution: J'ai encore rencontré ce problème deux fois, et j'ai noté que si j'appelle KeyColumn(string columnName) dans le IAutoMappingOverride pour le Parent, la clé étrangère dans la classe enfant sera par défaut Nullable, plutôt que Non-Null. Crazy Huh?

+0

Le mélange de cartes fluides et l'automatisation peuvent en effet être gênants. L'interface IAutomappingOverride vous donne à peu près toutes les capacités que les cartes fluides font et il le fait d'une manière qui joue bien avec l'automapping. Puisque vous utilisez le mappage automatique, je vous suggère d'essayer d'utiliser IAutomappingOverride chaque fois que possible plutôt que ClassMaps. –

3

Avez-vous essayé ceci:

public class ChildMap : IAutoMappingOverride<Child> 
    { 
     public void Override(AutoMapping<Child> mapping) 
     { 
      mapping.References(x => x.OtherThing) 
       .Nullable(); 
     } 
    } 

Si vous voulez faire la valeur par défaut pour toutes les clés étrangères, vous pouvez utiliser ceci:

public class NullableFKConvention : IReferenceConvention 
    { 
     public void Apply(IManyToOneInstance instance) 
     { 
      instance.Nullable(); 
     } 
    } 
+0

Je vais essayer, j'ai juste supposé que vous étiez seulement supposé utiliser .Référence pour les relations un à un et HasMany pour une à plusieurs relations. Mais je suppose que cette hypothèse était fausse. –

+0

La première solution génère cette erreur: Une association de la table Parent fait référence à une classe non mappée: System.Collections.Generic.IList , je suppose que je dois laisser mapper la collection. Je restreignais l'automapper aux entités héritées d'une classe de base. Pourtant, il semble un peu maladroit, même si cela finit par fonctionner. –

+0

References() sert à définir une relation many-to-one, ce qui correspond exactement à la relation entre Child et SomeThirdClass dans votre exemple ci-dessus, donc c'est un ajustement. Si vous vouliez que Child ait une référence vers son Parent, vous obtiendriez aussi cela (si vous n'étiez pas automapping) en utilisant References(). Pas sûr de suivre votre commentaire sur maladresse. Généralement, vous laissez l'automappeur mapper votre domaine entier, puis vous spécifiez des substitutions d'automapping pour le bit que vous souhaitez gérer différemment. En quoi votre cas est-il différent? –