Frage

Wir sind mit dem DTO Muster unserer Domain-Objekte aus der Dienstschicht in unseren Repository Marschall, und dann nach unten in die Datenbank über NHibernate.

Ich habe auf ein Problem stoßen, wodurch ich ein DTO aus dem Repository ziehen (z CustomerDTO) und dann konvertieren in das Domain-Objekt (Kunde) in meiner Dienstschicht. Ich dann versuchen, ein neues Objekt speichern zurück (zum Beispiel Salesorder), die das gleiche Kunden-Objekt enthält. Dies wird wiederum umgewandelt in eine SalesOrderDTO (und CustomerDTO) für in das Repository schieben.

NHibernate nicht mag this- es wirft der CustomerDTO ein doppelter Datensatz ist. Ich gehe davon aus, dass dies, weil es die erste CustomerDTO in der gleichen Sitzung herausgezogen und weil die Rückkehr zurück wurde umgewandelt und her kann es nicht erkennen, dies als das gleiche Objekt.

Bin ich stecken hier oder ist es eine Möglichkeit, um dieses?

Danke

James

War es hilfreich?

Lösung

Sie können ein Objekt auf eine Sitzung in NHibernate wieder anbringen durch Sperren mit - z. B.

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

, die abhängig oder nicht genau helfen kann, was hier geschieht. Auf einer Seite zur Kenntnis, mit NHibernate DTO nicht die gängige Praxis ist, die Tatsache, dass NHibernate (meist) Persistenz Unwissenheit unterstützt bedeutet, dass typischerweise DTO nicht so weit wie bei einigen anderen ORM-Frameworks verwendet.

Andere Tipps

Es ist wirklich wie NHibernate Sitzung funktioniert. Also, wenn Sie innerhalb einer Sitzung eine Instanz Ihrer CustomerDTO ziehen und dann nach einer Weile sollen Sie die gleiche CustomerDTO (etwa durch Primärschlüssel) bekommen - Sie tatsächlich Bezug auf das gleiche Objekt erhalten werden, wie Sie in Ihrem ersten Abruf taten

Also, was Sie tun, ist, dass Sie entweder die Objekte verschmelzen durch session.Merge aufrufen oder Sie bitten, Ihre Sitzung für das Objekt durch den Aufruf session.Get (primaryKey) tun, um Ihre Updates und spülen Sie die Sitzung.

Doch wie von Steve vorgeschlagen - ist dies nicht die Regel, was Sie tun - Sie wirklich Ihr Domain-Objekt aus dem Datenspeicher erhalten mögen und DTOs verwenden (wenn neede), um die Daten zu übertragen UI, webservice was auch immer ...

Wie andere haben darauf hingewiesen, Implementierung Equals und GetHashCode ist ein Schritt in die richtige Richtung. Blick in auch NHibernate Unterstützung für das "Attach" OR / M Idiom.

Sie haben auch die nosetter.camelcase Option zur Verfügung: http://davybrion.com/blog/2009/03/entities-required-properties-and-properties-that-shouldnt-be-modified/

Darüber hinaus würde Ich mag Sie zu ermutigen, nicht online durch den Mangel an Informationen da draußen abgebracht werden. Es bedeutet nicht, du bist verrückt, oder Dinge falsch zu machen. Es bedeutet nur, du bist in einem Rand Fall arbeiten. Leider sind die größten Verbraucher von Bibliotheken wie NHibernate eher klein im Hause und / oder Web-Anwendungen, in denen die Freiheit existiert zu lehnen alle Ihre Ausdauer braucht gegen eine einzelne Datenbank. In Wirklichkeit gibt es viele Ausnahmen von dieser Regel.

Zum Beispiel, ich arbeite derzeit an einer kommerziellen Desktop-Anwendung, wo eine meiner Domain-Objekte haben zwischen einer SQL CE-Datenbank und Bilddateien auf der Festplatte ihre Daten zu verbreiten. NHibernate kann mir nur mit der SQL CE Ausdauer hilft leider. Ich bin eine Art "Double Mapping" zu verwenden gezwungen (siehe Martin Fowler „Patterns of Enterprise Application Architecture ") Karte meiner Domain-Modells durch eine Repository-Schicht, der weiß, welche Daten gehen an NHibernate und was auf der Festplatte.

Es passiert. Es ist ein echtes Bedürfnis. Manchmal ein offensichtlicher Mangel in einem Werkzeug zeigt Ihnen einen schlechten Ansatz einnehmen. Aber manchmal ist die Wahrheit ist, dass Sie nur wirklich in einem Rand Fall sind, und müssen für sich selbst einige dieser Muster bauen, um es getan.

  

Ich gehe davon aus, dass dies, weil es   die erste CustomerDTO zog in   die gleiche Sitzung und weil die   Rückkehr wurde zurückgewandelt und   her kann es dies nicht als das erkennen   gleiches Objekt.

Sie haben Recht. Hibernate kann es nicht. Betrachten Sie Equals und Hashcode Umsetzung dieses Problem zu beheben. Ich denke, eine Wieder anhängen kann nur funktionieren, wenn Sie nicht das Objekt innerhalb dieser Sitzung geladen haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top