Domanda

Sono nuovo in Hibernate, l'aspetto della configurazione mi è sempre sembrato eccessivamente oneroso.Ieri mi sono imbattuto nelle funzionalità di Auto Mapping di Fluent NHibernate e sono rimasto davvero colpito.

Per istruirmi, mi sono posto la sfida di tentare il "Primo progetto introduttivo" (http://wiki.fluentnhibernate.org/show/GettingStartedFirstProject) utilizzando AutoMapping e Convenzioni.Devo ammettere di non aver avuto molta fortuna.

Per riassumere i miei passi:

Ho apportato alcune piccole modifiche allo schema del database nell'esempio, principalmente per rimuovere i caratteri di sottolineatura dalle chiavi esterne (ad es.Product_id in ProductId) in quanto ciò lo renderebbe più in linea con i nostri standard di denominazione del database.

Q1) Ho provato a scrivere un'implementazione IHasManyConvention utilizzando ForeignKeyConvention come esempio ma il metodo WithKeyColumn non sembra esistere (presumo che ciò sia dovuto al fatto che ho scaricato la build di ieri, quindi successivamente il design è cambiato da quando è stato scritto l'articolo).Come posso correggere questo problema?

Ho anche apportato alcune piccole modifiche al livello Entità nell'esempio poiché pensavo che ciò lo avrebbe reso più semplice, dovevano rinominare StoresStockedIn in Stores (Product.cs) e Staff in Employees (Store.cs).

Il mio codice è simile a questo:

var cfg = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2005
    .ConnectionString(c => c
        .Is(connectionString)))
.Mappings(m => m.AutoMappings.Add(
                AutoPersistenceModel.MapEntitiesFromAssemblyOf<Store>()
                    .Where(t => t
                        .Namespace == "FluentNHibernateTesting.Entities")
                        .ConventionDiscovery.Setup(c => c.Add<ForeignKeyConvention>())
                ))
.BuildSessionFactory();

Quindi provo ad aggiungere negozi, prodotti e dipendenti al database come nell'esempio iniziale.L'eccezione che ottengo si verifica sul Commit ed è:

l'oggetto fa riferimento a un'istanza temporanea non salvata: salva l'istanza temporanea prima di eseguire lo scaricamento.Tipo:FluentNHibernateTesting.Entities.Employee, Entità:FluentNHibernateTesting.Entities.Employee

Q2) Come risolvo questo problema?Capisco (dalla mia lettura limitata) che ha qualcosa a che fare con l'impostazione corretta degli elementi a cascata delle relazioni tra oggetti, ma sono un po' perplesso su come procedere in modo efficace utilizzando la mappatura automatica.

Q3) Esiste una data di rilascio prevista per il progetto Fluent?Io (come presumo molti altri) ritengo che questa sia un'iniziativa eccellente, ma sono consapevole di utilizzarla a meno che non sia in uno stato stabile.

D4) In molti blog viene menzionato il fatto che stanno lavorando costantemente per raggiungere la parità delle funzionalità di Fluent con hbn.xml.Esiste da qualche parte un elenco di queste funzionalità mancanti per facilitare la valutazione e l'utilizzo di questo strumento?

Apprezzo l'aiuto in anticipo.

È stato utile?

Soluzione

Ho rivolto direttamente a James Gregory le stesse domande in un'e-mail.Ha fornito questa eccellente risposta.

'Ciao Paolo,

1) KeyColumnNames è ciò che cerchi.

2) Puoi farlo in 3 modi.Configura una IHasManyConvention per rendere globalmente tutte le relazioni a cascata, utilizzare una chiamata ForTypesThatDeriveFrom o un override della mappatura automatica.

3) Attualmente stiamo testando privatamente la nostra versione 1.0.Non siamo sicuri se avremo una beta pubblica o un rilascio diretto, ma ciò dovrebbe accadere nelle prossime settimane.

4) È molto improbabile che saremo mai completamente completi di funzionalità con NHibernate, non abbiamo alcun desiderio di esserlo.Molte delle funzionalità di NH sono estremamente esoteriche e la loro implementazione comporta pochi vantaggi.A partire dalla versione 1.0 ci saranno pochissime funzionalità non supportate che le persone utilizzeranno regolarmente.Posso affermare con sicurezza che tutti gli scenari di mappatura più comuni sono soddisfatti e, se c'è qualcosa che non lo è, puoi sempre tornare a hbm per quel caso.

Per evitare eventuali commenti secondo cui i nostri documenti non sono aggiornati, la documentazione verrà revisionata per la versione 1.0 ;)

James'

Grazie Giacomo.

Altri suggerimenti

  

C'è una data di uscita obiettivo per il   progetto perfetto? I (come suppongo molti   altri) si sentono questa è un'ottima   iniziativa ma sono consapevole di usarlo   a meno che non si trova in uno stato stabile.

Si dovrebbe essere in grado di ottenere una versione funzionante di Fluent NHibernate dal loro repository SVN ora. Essi hanno anche compilato binari.

Al momento non ci sono, non tutti i rilasci ufficiali di Fluent NHibernate. Questo non è un riflesso della qualità, ma della nostra rapido tasso di cambiamento. Il nostro codice-base viene aggiornato quotidianamente, che fa mettere fuori stampa ufficiali uno sforzo inutile fino a quando otteniamo caratteristica parità con NHibernate Nucleo. La maggior parte delle funzioni regolari che usate giorno per giorno sono pronti.

http://fluentnhibernate.org/downloads

I problemi attuali sono qui:

http://code.google.com/p/fluent-nhibernate / temi / lista

Nessuno di loro sembra essere affare-killer. Immagino che dipende da quanto tempo si deve sperimentare.

  

oggetto fa riferimento a un transitorio non salvato   esempio - salva l'istanza transiente   prima del lavaggio. Genere:   FluentNHibernateTesting.Entities.Employee,   Entità:   FluentNHibernateTesting.Entities.Employee

Se Google oggetto fa riferimento a un'istanza transiente non salvato , si trovano diverse partite per questo. La cosa migliore è quello di iniziare a passare attraverso questi e la risoluzione dei problemi. Aneddoticamente, da quello che ho letto sembra che il messaggio di errore significa esattamente quello che dice, o v'è una relazione molti-molti o cascata che non è sempre aggiornato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top