0

Je suis une relation polymorphes comme l'exemple suivant:Comment puis-je arrêter Fluent NHibernate de créer des clés étrangères

public class A 
{ 
    public virtual Guid Id { get; set; } 
    public virtual string Name { get; set; } 
} 

Classe B & C contining une liste d'A:

public class B/C 
{ 
    public virtual Guid Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual IList<A> As { get; set; } 
    public virtual SomeParent Parent { get; set; } 
} 

Mon but sont requêtes comme

session.Linq<B>().Where(x => x.Parent == someParent && x.As.Contains(someA)); 

Actuellement, j'ai configuré une relation Many-To-Many entre B => A et C => A en utilisant une table de liens partagés parce que je veux avoir tous mes liens dans une table. Dans cet exemple, NH shema export crée 4 tables, A, B, C et ChildToA.

HasManyToMany(x => x.As) 
      .AsBag() 
      .Table("XX_ChildToA") 
      .ParentKeyColumn("Child_ID") 
      .ChildKeyColumn("A_ID") 
      .Cascade.All() 

Cela fonctionne bien aussi longtemps que vous utilisez seulement un des types d'enfants parce que l'exportation de shema génère une clé étrangère limitant la « child_id » aux ID de quelque table, il frappe d'abord lors de l'exportation (B dans ce cas). Est-ce que je peux arrêter FluentNHibernate de créer ce FK?

var b = session.Get<B>(id); 
b.As.Add(someA); 
tx.Commit(); // works fine 

var c = session.Get<C>(id); 
c.As.Add(someA); 
tx.Commit(); // crashes because of FK constraint 

Pendant que je cherchais google pour ce problème, j'ai remarqué des exemples HBM avec des attributs foreign-key = "no" dans les relations many-to-one. Donc, NHibernate devrait être capable de résoudre ça, n'est-ce pas? Cependant je voudrais garder mes mappings courants parce que je peux créer une classe de mappage de base générique pour tous mes types enfants de cette façon et actuellement tous nos mappages sont des mappages FNH.

Répondre

2

Cela devrait le faire:

HasManyToMany(x => x.As) 
    .ForeignKeyConstraintNames("no", "no"); 
+0

C'est ça! Merci beaucoup. Je pensais que la méthode ForeignKeyConstraintNames définit le modèle de nommage de sorte que les clés ne sont pas nommées comme des valeurs hexadécimales aléatoires;) – Zebi

+0

Cela se fait aussi. C'est l'équivalent de l'attribut de clé étrangère mentionné par d'autres personnes. –

+0

ForeignKeyConstraintNames ("non", "non") ne fonctionne pas (au moins dans Fluent NHibernate 1.3.0.717 que j'utilise actuellement dans l'un de mes projets). La bonne chose est que ForeignKeyConstraintNames ("none", "none") fait :) –

1

Je ne suis pas tout à fait familier avec FluentNHibernate, mais je suppose que vous pouvez définir cet attribut personnalisé sur votre carte pour la collection en utilisant quelque chose comme:

.SetAttribute("foreign-key", "no")

+0

Je ne peux pas le vérifier jusqu'à demain au travail mais je suis relativement sûr qu'il n'y a pas de méthode SetAttribute sur le mappage. J'ai déjà utilisé cette méthode sur l'objet de configuration pour définir la taille du lot et ma première pensée a été de le faire de la même manière sur la définition de mappage. – Zebi

+0

@Zebi: Je crois que vous avez raison; lors de l'examen des documents FluentNHibernate, il ne semble pas que vous puissiez utiliser .SetAttribute() sur un mappage de collection ... – DanP

+0

J'ai juste eu l'idée de pointer l'automapper sur un testcase légèrement différent (b + c obtient une interface IChild, A obtient liste d'IChild) et observez ce qui se passe. Il devrait en résulter un mappage Many-to-Any ... peut-être que les mappages sont corrects de cette façon. – Zebi

Questions connexes