11

Creo que esto debería ser simple, pero no puedo encontrar la manera de hacerlo. Supongamos que tengo los siguientes mapas:Fluent Nhibernate 1.0 - Especifique el nombre de restricción de clave externa entre la clase y la subclase unida

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

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

que crea tablas como espero:

Animal 
------ 
Id 

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

Como se ha señalado, el FK se genera por el PP y termina como FK3500ABA0D. Todo lo que quiero hacer es establecer el nombre de esa restricción, pero no puedo encontrar cómo hacerlo a través de Fluiber NHibernate (o incluso NHibernate, para el caso).

Entonces, ¿qué es lo que me falta?

+0

FNH 1.0 no tienen la capacidad de FKs nombre. Mi respuesta aceptada pertenece a esa versión, pero las versiones posteriores deberían ver la respuesta a continuación. – Andy

Respuesta

0

No sé si FluentNH lo soporta, pero el XML es simple:

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

Fluido NH sí permite esto:

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

También había necesidad de poner en práctica IHasManyConvention y IHasManyToManyConvention de la misma manera que arriba.

+0

FYI, en el momento en que se formuló la pregunta y la respuesta esa característica no estaba en FNH. Actualicé la pregunta y dejé un comentario que explica por qué no se cambia la respuesta aceptada. ¡Gracias por tu respuesta también! – Andy

0

que tenían el mismo problema, los siguientes funciona bien para mí:

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

Su restricción de clave externa a continuación, sería nombrado como FK_Cat_Animal

+0

¿Funcionó esto con FNH 1.0 sin embargo? Versiones posteriores corrigieron el problema, pero esta pregunta es acerca de 1.0 específicamente. – Andy

Cuestiones relacionadas