Domanda

Stiamo utilizzando il modello DTO al maresciallo nostri oggetti di dominio del livello di servizio nella nostra repository, e poi giù al database tramite NHibernate.

Ho incontrato un problema per cui io tiro un DTO fuori del repository (ad esempio CustomerDTO) e poi convertirlo in oggetto di dominio (Clienti) nel mio livello di servizio. Ho poi cercare di salvare un nuovo oggetto di nuovo (per esempio SalesOrder) che contiene lo stesso oggetto del Cliente. Questo è a sua volta convertito in un SalesOrderDTO (e CustomerDTO) per la spinta nel repository.

NHibernate non piace questo- si lamenta che la CustomerDTO è un record duplicato. Sto assumendo che questo è perché ha tirato fuori la prima CustomerDTO nella stessa sessione e perché il ritorno è stato convertito in avanti e indietro, non può riconoscere questo come lo stesso oggetto.

Sono bloccato qui o c'è un modo per aggirare questo?

Grazie

James

È stato utile?

Soluzione

È possibile ri-collegare un oggetto a una sessione di NHibernate utilizzando Lock -. Per esempio

_session.Lock(myDetachedObject, NHibernate.LockMode.None);

che può o non può aiutare a seconda esattamente ciò che sta accadendo qui. Su un lato nota, utilizzando DTO con NHibernate non è la pratica più comune, il fatto che NHibernate (per lo più) supporta la persistenza ignoranza significa che in genere DTO non sono così ampiamente usato come con alcuni altri framework ORM.

Altri suggerimenti

E 'davvero di come funziona la sessione di NHibernate. Quindi, se all'interno di una sessione di tiri un'istanza della CustomerDTO e poi dopo un po 'si dovrebbe ottenere lo stesso CustomerDTO (diciamo dalla chiave primaria) - in realtà si otterrà riferimento allo stesso oggetto come avete fatto nel vostro primo recupero

Quindi, ciò che si fa è che si sia di unire gli oggetti chiamando session.Merge oppure chiedere la sessione per l'oggetto chiamando session.Get (primaryKey) fare i vostri aggiornamenti e lavare la sessione.

Tuttavia, come suggerito da Steve - questo non è di solito quello che si fa - si vuole veramente ottenere il vostro oggetto di dominio dalla datastore e utilizzare DTOs (se neede) per trasferire i dati da interfaccia utente, webservice qualunque cosa ...

Come altri hanno notato, Uguale applicazione e GetHashCode è un passo nella direzione giusta. Anche prendere in considerazione il supporto di NHibernate per la "attach" O / M idioma.

Hai anche la possibilità nosetter.camelcase a vostra disposizione: http://davybrion.com/blog/2009/03/entities-required-properties-and-properties-that-shouldnt-be-modified/

Inoltre, vorrei incoraggiarvi a non essere dissuasi dalla mancanza di informazioni là fuori linea. Ciò non significa che sei pazzo, o fare cose sbagliate. Significa solo che si sta lavorando in un caso limite. Purtroppo i maggiori consumatori di librerie come NHibernate sono piccole in-house e / o applicazioni web, dove esiste la libertà di appoggiarsi tutta la vostra perseveranza ha bisogno contro un singolo database. In realtà, ci sono molte eccezioni a questa regola.

Per esempio, sto attualmente lavorando su un'applicazione desktop commerciale dove uno dei miei oggetti di dominio ha diffuso i suoi dati tra un file di database e di immagine di SQL CE sul disco. Purtroppo NHibernate può solo aiutarmi con la persistenza SQL CE. Sono costretto a utilizzare una sorta di "doppio Mapping" (vedi "Modelli di Martin Fowler di Enterprise Application Architecture ") mappa mio modello di dominio attraverso uno strato repository che sa quali dati va a NHibernate e cosa disco.

Succede. Si tratta di una vera e propria necessità. A volte un apparente mancanza di uno strumento indica che stai prendendo un cattivo approccio. Ma a volte la verità è che si sono solo veramente in un caso limite, e la necessità di costruire fuori alcuni di questi modelli per voi stessi per farlo fare.

  

sto supponendo che questo è perché   tirato fuori la prima CustomerDTO in   la stessa sessione e perché il   il ritorno è stato convertito indietro e   avanti non può riconoscere questo come   stesso oggetto.

Hai ragione. Hibernate non può. Considerare l'implementazione di Equals e hashCode per risolvere questo problema. Credo che un re-attach può funzionare solo se non è stato caricato l'oggetto all'interno di questa sessione.

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