11

Penso che questo dovrebbe essere semplice, ma non riesco a capire come farlo. Supponiamo che io sono le seguenti mappe:Fluent Nhibernate 1.0 - Specifica il nome del vincolo di chiave esterna tra classe e sottoclasse unita

public class AnimalMap : ClassMap<Animal> { Id(x => x.Id); } 

public class CatMap: SubclassMap<Cat> { 
    Extends<AnimalMap>(); 
    Map(x => x.IsDomestic); 
} 

che crea le tabelle come mi aspetto:

Animal 
------ 
Id 

Cat 
---- 
AnimalId : FK to Animal (named FK3500ABA0D) 
IsDomestic 

Come osservato, l'FK viene generato dal db e finisce come FK3500ABA0D. Tutto quello che voglio fare è impostare il nome di quel vincolo, ma non riesco a trovare come farlo tramite Fluent NHibernate (o in realtà anche solo NHibernate, se è per questo).

Quindi, cosa mi manca?

+0

FNH 1.0 non ha avuto la capacità di nome FKS. La mia risposta accettata riguarda questa versione, ma le versioni successive dovrebbero vedere la risposta sotto. – Andy

risposta

0

Non so se FluentNH lo supporta, ma l'XML è semplice:

<joined-subclass name="Cat"> 
    <key column="AnimalId" foreign-key="NameOfTheFK"/> 
</joined-subclass> 
21

perfetto NH fa permettere questo:

public class ReferenceConvention : IReferenceConvention{ 
    public void Apply(IManyToOneInstance instance) { 
      instance.ForeignKey(string.Format("FK_{0}_{1}", 
       instance.EntityType.Name, 
       instance.Name)); 
    } 
} 

Si aveva anche bisogno di implementare IHasManyConvention e IHasManyToManyConvention allo stesso modo di sopra.

+0

FYI, al momento della domanda è stata posta e rispondere a quella funzione non era in FNH. Ho aggiornato la domanda e lasciato un commento per spiegare perché la risposta accettata non viene modificata. Grazie anche per la tua risposta! – Andy

0

Ho avuto lo stesso problema, i seguenti lavori bene per me:

public class JoinedSubclassForeignKeyConvention : IJoinedSubclassConvention 
{ 
    public void Apply(IJoinedSubclassInstance instance) 
    { 
     if (instance.Type.BaseType != null) 
      instance.Key.ForeignKey(string.Format("FK_{0}_{1}", instance.EntityType.Name, instance.Type.BaseType.Name)); 
    } 
} 

vostro vincolo di chiave esterna sarebbe poi chiamato come FK_Cat_Animal

+0

Ha funzionato con FNH 1.0? Le versioni successive hanno risolto il problema, ma questa domanda riguarda specificamente 1.0. – Andy