2009-07-20 41 views
23

tengo una clase en mi dominio raíz del modelo que se parece a esto:NHibernate DuplicateMappingException cuando dos clases tienen el mismo nombre pero diferentes espacios de nombres

namespace Domain 
{ 
    public class Foo { ... } 
} 

También tengo otra clase con el mismo nombre en un espacio de nombres diferentes:

namespace Domain.SubDomain 
{ 
    public class Foo { ... } 
} 

para mis asignaciones, que tienen un directorio Mapping con un subdirectorio llamado SubDomain que contiene asignaciones para las clases de dominio se encuentran en Domain.SubDomain espacio de nombres. Todos están en la misma asamblea.

Sin embargo, cuando intento cargarlos con NHibernate, sigo obteniendo un DuplicateMappingException ... aunque ambos Foos tienen diferentes espacios de nombres. El código que estoy utilizando para cargar la configuración de mi NHibernate es la siguiente:

var cfg = new Configuration() 
    .Configure()     
    .AddAssembly("Domain"); 

¿Cómo puedo saber NHibernate para dejarme usar dos entidades con el mismo nombre (pero diferentes espacios de nombres)?

+0

En caso de que ayude a alguien: la misma pregunta para Fluent.nHibernate: https://stackoverflow.com/questions/1290466/ – Malcolm

Respuesta

22

he encontrado el answer en el sitio web de Hibernate:

Si tiene dos clases persistentes con el mismo nombre no calificado, se debe establecer auto-import = "false". Se producirá una excepción si intenta para asignar dos clases al mismo nombre "importado" .

Lo usé como un atributo para la etiqueta <hibernate-mapping> y funcionó.

+0

¿Alguien sabe cómo hacer esto al usar ** NHibernate.Mapping.Attributes ** en el mapa? –

3

Puede indicar el nombre completo a clases en el documento de mapeo de este modo:

<class name="SeeMe.Data.People.Relationship, SeeMe.Data" ... > ... 

Dónde SeeMe.Data es la asamblea.

+1

Aún dice: 'NHibernate.DuplicateMappingException: importación duplicada: Foo se refiere a ambos Domain.SubDomain.Foo, Domain, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null y Domain.Foo, Domain, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null (prueba usando auto-import = "false") ' – cdmckay

+1

Dammit, tan pronto como copié y pegué vi la sugerencia 'auto-import =" false "' ... y funcionó. – cdmckay

+1

hehe saight, nHibernate rocks pero siento que no es muy intuitivo. He pasado mucho tiempo golpeando mi cabeza sobre algún problema de mapeo tonto. –

16

He tenido el mismo problema. Lo resuelto de esta manera:

Fluently.Configure() 
      .Database(MsSqlConfiguration.MsSql2008 
       .ConnectionString(...) 
       .AdoNetBatchSize(500)) 
      .Mappings(m => m.FluentMappings 
       .Conventions.Setup(x => x.Add(AutoImport.Never())) 
       .AddFromAssembly(...) 
       .AddFromAssembly(...) 
       .AddFromAssembly(...) 
       .AddFromAssembly(...)) 
      ; 

La pieza importada es: .Conventions.Setup(x => x.Add(AutoImport.Never())). Todo parece funcionar bien con esta configuración.

+1

¿Podría agregar una explicación de los nombres de tabla utilizados con esta configuración? Gracias. –

Cuestiones relacionadas