2010-12-29 5 views
1

Vor einer Woche hatte ich eine ASP.NET MVC-Anwendung, die eine logische POCO-Service-Schicht aufgerufen hat, um Geschäftslogik gegen Entitäten auszuführen. Ein Ansatz, den ich häufig verwendete, war die Verwendung von AutoMapper zum Zuordnen eines besetzten Ansichtsmodells zu einer Entität und zum Aufrufen der Aktualisierung der Entität (Pseudocode unten). NHibernate Update-Methode auf der EntitätASP.NET MVC -> WCF -> NHibernate, wie Entität mit Daten aus Viewmodel effizient zu aktualisieren?

MyEntity myEntity = myService.GetEntity(param); 

Mapper.CreateMap<MyEntityVM, MyEntity>(); 
Mapper.Map(myEntityVM, myEntity); 

this.myService.UpdateEntity(myEntity); 

Der Update Anruf würde eine Instanz des Unternehmens und über ein Endlager nehmen, rufen.

Nun, ich habe vor kurzem meine logische Service-Schicht in WCF Web Services geändert. Ich habe festgestellt, dass die Verbindung, die NHibernate mit einer Entität herstellt, jetzt verloren ist, wenn die Entität von der Serviceschicht an meine Anwendung gesendet wird. Wenn ich versuche, in der Update-Methode gegen die Entity zu arbeiten, sollten Dinge in der NHibernate-Sitzung nicht sein und umgekehrt - sie beschweren sich über Nullen auf Kind-IDs und dergleichen.

Also meine Frage ...

Was kann ich effizient von meinem besiedelten Ansichtsmodell Eingang nehmen und schließlich das Objekt durch NHibernate Modifikation am Ende?

  • Gibt es eine schnelle Lösung, die ich mit NHibernate anwenden kann?
  • Soll ich die Änderungen von der Anwendung auf die Serviceebene übertragen?

EDIT:

Der beste Ansatz, den ich von jetzt denken kann, ist eine neue Einheit zu schaffen und aus der Sicht Modell der neuen Einheit (einschließlich der Kennung) abzubilden. Ich würde dies an die Service-Schicht übergeben, wo es die Entität mithilfe des Repositorys abrufen würde, die Änderungen mithilfe von AutoMapper zuordnen und die Aktualisierungsmethode des Repositorys aufrufen. Ich werde zweimal mappen, aber es könnte funktionieren (obwohl ich eine Reihe von Eigenschaften/Kinder in der zweiten Zuordnung auszuschließen).

Antwort

1

Keine schnelle Lösung. Sie sind über das Drahtproblem in die Änderungsverfolgung gelaufen. AFAIK NHibernate hat keine native Möglichkeit, dies zu handhaben.

Diese helfen können:

https://forum.hibernate.org/viewtopic.php?f=25&t=989106

http://lunaverse.wordpress.com/2007/05/09/remoting-using-wcf-and-nhibernate/

In aller Kürze Ihre beiden Optionen sind Ihre Service einzustellen Informationen Zustandsänderung über die Nhibernate senden können die Objekte lesen oder laden, gelten die ändert sich und speichert dann in Ihrer Serviceebene.

Haben Sie keine Angst, eine Auswahl vor einem Update in Ihrem Service zu tun. Dies ist ohnehin empfehlenswert, um Nebenläufigkeitsprobleme zu vermeiden.

1

Ich weiß nicht, ob dies der beste Ansatz ist, aber ich wollte Informationen über eine quick fix mit NHibernate weitergeben.

Von NHibernate.xml ...

<member name="M:NHibernate.ISession.SaveOrUpdateCopy(System.Object)"> 
    <summary> 
    Copy the state of the given object onto the persistent object with the same 
    identifier. If there is no persistent instance currently associated with 
    the session, it will be loaded. Return the persistent instance. If the 
    given instance is unsaved or does not exist in the database, save it and 
    return it as a newly persistent instance. Otherwise, the given instance 
    does not become associated with the session. 
    </summary> 
    <param name="obj">a transient instance with state to be copied</param> 
    <returns>an updated persistent instance</returns> 
</member> 

Es funktioniert, obwohl ich keine Zeit gehabt haben, die Datenbank zu prüfen, Anrufe zu sehen, ob es genau tut, was ich zu tun erwarten.

Verwandte Themen