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.
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
Cela se fait aussi. C'est l'équivalent de l'attribut de clé étrangère mentionné par d'autres personnes. –
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 :) –