11

Estamos utilizando Fluiber NHibernate para el modelo de objetos de datos en la empresa en la que trabajo. Hace un par de días, nos encontramos con un problema que Fluent NHibernate genera una columna adicional que no existe ni en el modelo ni en el mapeo. Aquí está la situación:Fluido NHibernate genera columnas adicionales

Mi Modelo: FirstClass.cs

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

Mi Mapping:

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

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

Después de construir el esquema con el siguiente código,

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 columna llamada "SecondClass_id" se produce con índice y clave externa a la tabla SecondClass con la columna Id. Aquí está la tabla producido:

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; 

me encontré con que, si cambio el nombre de "MiReferencia" a "de segunda clase" (el mismo nombre que el tipo de clase), no hay una columna adicional creado. Pero quiero usar mi propiedad con el nombre que especifiqué, no con el nombre de la clase. ¿Por qué se crea esa columna adicional? ¿Cómo arreglo eso? No quiero que haya columnas adicionales de llaves foráneas.

+1

quieres decir si cambias el nombre de propiedad diferente del nombre del objeto, crea dos campos uno es tu_nombre_de_choque ¿otro es el nombre_objeto? – gandil

+0

Definitivamente. ¿Alguna idea de por qué? – SadullahCeran

+0

Suena extraño. ¿Qué sucede si especifica el nombre de la columna explícitamente? Referencias (x => x.MyReference, "SecondClass_id"); –

Respuesta

18

Esto sucede a menudo cuando usa FNH y tiene una relación bidireccional entre las entidades.

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

Para solucionar este problema, tiene que reemplazar el nombre de la columna utilizada en cualquiera ClassMap, así:

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 razón de esto es que la HNF trata cada mapeo como una relación separada, por lo tanto, se crean diferentes columnas, claves e índices.

+0

Gracias por la gran respuesta. Lo probaré. – SadullahCeran

+0

'HasMany()' no tiene un método 'Column()', use 'KeyColumn()' en su lugar. –

+0

@Gweebz gracias por resolver mi error tipográfico, he actualizado mi respuesta. –

Cuestiones relacionadas