11

Utilizziamo Fluent NHibernate per il modello di oggetti dati nell'azienda in cui lavoro. Un paio di giorni fa, abbiamo riscontrato un problema che Fluent NHibernate genera una colonna aggiuntiva che non esiste né nel modello né nella mappatura. Ecco la situazione:Fluente NHibernate genera colonne aggiuntive

il mio modello: FirstClass.cs

public class FirstClass 
{ 
    public virtual int Id { get; private set; } 
    public virtual SecondClass MyReference { get; set; } 
    public virtual DateTime DecisionDate { get; set; } 
} 

mio Mapping:

public class FirstClassMap : ClassMap<FirstClass> 
{ 
    public FirstClassMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.DecisionDate); 

     References(x => x.MyReference); 
    } 
} 

Dopo aver costruito lo schema con il seguente codice,

Instance._sessionFactory = Fluently.Configure() 
       .Database(MySQLConfiguration.Standard 
        .ConnectionString(connectionString) 
        .ShowSql()) 
       .ExposeConfiguration(c => 
       { 
        c.Properties.Add("current_session_context_class", ConfigurationHelper.getSetting("SessionContext")); 
       }) 
       .ExposeConfiguration(BuildSchema) 
       .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Community>()) 
       .BuildSessionFactory(); 

Un extra la colonna denominata "SecondClass_id" viene prodotta con indice e chiave esterna nella tabella di SecondClass con colonna Id. Ecco la tabella prodotta:

CREATE TABLE `FirstClass` (
    `Id` int(11) NOT NULL AUTO_INCREMENT, 
    `DecisionDate` datetime DEFAULT NULL, 
    `MyReference_id` int(11) DEFAULT NULL, 
    `SecondClass_id` int(11) DEFAULT NULL, 
    PRIMARY KEY (`Id`), 
    KEY `MyReference_id` (`MyReference_id`), 
    KEY `SecondClass_id` (`SecondClass_id`), 
    CONSTRAINT `FK4AFFB59B2540756F` FOREIGN KEY (`MyReference_id`) REFERENCES `SecondClass` (`Id`), 
    CONSTRAINT `FK4AFFB59B51EFB484` FOREIGN KEY (`SecondClass_id`) REFERENCES `SecondClass` (`Id`), 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

ho scoperto che, se io cambio titolo "MyReference" a "secondClass" (stesso nome del tipo di classe), non v'è alcuna colonna in più creato. Ma voglio usare la mia proprietà con il nome che ho specificato, non con il nome della classe. Perché viene creata questa colonna aggiuntiva? Come lo risolvo? Non voglio colonne extra di chiavi straniere in giro.

+1

significa che se si modifica il nome della proprietà diverso dal nome dell'oggetto viene creato due campi uno è your_choosen_name altro è object_name? – gandil

+0

Definitivamente. Tutte le idee perché? – SadullahCeran

+0

Sembra strano. Cosa succede se si specifica esplicitamente il nome della colonna. Riferimenti (x => x.MyReference, "SecondClass_id"); –

risposta

18

Ciò accade spesso quando si utilizza FNH e si ha una relazione a due vie tra le entità.

public class FirstClass 
{ 
    public virtual SecondClass MyReference { get; set; } 
} 

public class SecondClass 
{ 
    public virtual List<FirstClass> ListOfFirstClass { get; set; } 
} 

public class FirstClassMap : ClassMap<FirstClass> 
{ 
    public FirstClassMap() 
    { 
     References(x => x.MyReference); 
    } 
} 

public class SecondClassMap : ClassMap<SecondClass> 
{ 
    public SecondClassMap() 
    { 
     HasMany(x => x.ListOfFirstClass); 
    } 
} 

Per risolvere questo problema è necessario sostituire il nome colonna utilizzata in entrambi i ClassMap, in questo modo:

public class SecondClassMap : ClassMap<SecondClass> 
{ 
    public SecondClasssMap() 
    { 
     HasMany(x => x.ListOfFirstClass).KeyColumn("MyReference_id"); 
    } 
} 

o:

public class FirstClassMap : ClassMap<FirstClass> 
{ 
    public FirstClassMap() 
    { 
     References(x => x.MyReference).Column("SecondClass_id"); 
    } 
} 

La ragione di questo è che FNH tratta ogni mappatura come relazione separata, quindi vengono create diverse colonne, chiavi e indici.

+0

Grazie per l'ottima risposta, ci provo io. – SadullahCeran

+0

'HasMany()' non ha un metodo 'Column()', usa invece 'KeyColumn()'. –

+0

@Gweebz grazie per aver digitato il mio errore di battitura, ho aggiornato la mia risposta. –

Problemi correlati