2009-07-20 4 views
23

ho una classe nel mio dominio principale modello che assomiglia a questo:NHibernate DuplicateMappingException quando due classi hanno lo stesso nome ma diversi spazi dei nomi

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

Ho anche un'altra classe con lo stesso nome in uno spazio dei nomi diversi:

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

per i miei mappature, ho una directory Mapping con una sottodirectory chiamata SubDomain che contiene mapping per le classi di dominio si trovano in Domain.SubDomain namespace. Sono tutti nella stessa assemblea.

Tuttavia, quando provo a caricarli con NHibernate, ottengo sempre un DuplicateMappingException ... anche se entrambi Foos hanno spazi dei nomi diversi. Il codice che sto usando per caricare la mia configurazione NHibernate è questo:

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

Come posso dire a NHibernate di farmi usare due entità con lo stesso nome (ma spazi dei nomi diversi)?

+0

Nel caso in cui aiuti qualcuno: stessa domanda per Fluent.nHibernate: https://stackoverflow.com/questions/1290466/ – Malcolm

risposta

22

ho trovato il answer sul sito di Hibernate:

Se si dispone di due classi persistenti con lo stesso nome non qualificato, si necessario impostare l'auto-import = "false". Si verificherà un'eccezione se si tenta di assegnare a due classi allo stesso nome "importato" .

L'ho usato come attributo per il tag <hibernate-mapping> e ha funzionato.

+0

Qualcuno sa come fare quando si usa ** NHibernate.Mapping.Attributes ** per mappare? –

3

È possibile specificare una classe nome completo nel documento di mappaggio in questo modo:

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

Dove SeeMe.Data è l'assemblea.

+1

Ancora dice: 'NHibernate.DuplicateMappingException: importazione duplicata: Foo si riferisce a entrambi Domain.SubDomain.Foo, Dominio, Versione = 1.0.0.0, Cultura = neutrale, PublicKeyToken = null e Domain.Foo, Dominio, Versione = 1.0.0.0, Cultura = neutrale, PublicKeyToken = null (prova a utilizzare auto-import = "falso") ' – cdmckay

+1

Dannazione, appena ho copiato e incollato ho visto il suggerimento auto-import = "false" 'e ha funzionato. – cdmckay

+1

hehe saight, nHibernate rocks ma mi sembra che non sia molto intuitivo. Ho passato un sacco di tempo a sbattere la testa su un problema di mappatura sciocca. –

16

Ho avuto lo stesso problema. Ho risolto in questo modo:

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

La parte importato è: .Conventions.Setup(x => x.Add(AutoImport.Never())). Tutto sembra funzionare bene con questa configurazione.

+1

Potresti aggiungere una spiegazione dei nomi delle tabelle usati con questa configurazione. Grazie. –