18 Stimmen

Öffentliche/interne Felder für NHibernate-Proxy ignorieren

Ich habe einige Entitätstypen, die ich gerne verzögert laden würde. Sie haben jedoch einige interne (Assembly) Felder, die sie freilegen, aber nicht außerhalb dieser Klasse verwendet werden. Diese Felder sind Compiler generiert (F#) und ich kann sie nicht ändern. Das Beispiel einer Ausnahme ist:

NHibernate.InvalidProxyTypeException: Die folgenden Typen dürfen nicht als Proxys verwendet werden: Mappings.MTest: Feld id@47 sollte weder öffentlich noch intern sein

Ich verstehe, warum NHibernate dies tut und wie die Felder, wenn ich auf sie zugreife, die Lazy-Loading-Eigenschaften der generierten Proxies durcheinander bringen würden. Da ich jedoch weiß, dass ich die Felder nicht verwenden werde, kann ich NHibernate irgendwie außer Kraft setzen?

Kann ich irgendwie festlegen, dass dieses Feld ignoriert wird? Ich bin mit Fluent NHibernate, wenn das es einfacher macht.

Bearbeiten: Ich sollte auch beachten, ich bin mit NHibernate 2.1.0 Alpha 2.

Edit2: Der Hauptpunkt hier ist, dass ich LazyLoading aktiviert lassen möchte, was bedeutet, dass ich die Proxy-Generierung verwenden muss. Deaktivieren von LazyLoading funktioniert (keine Proxies), aber sorta besiegt den Zweck eines netten Rahmens wie NHibernate.

17voto

MichaelGG Punkte 9900

Ich habe NHibernate neu zusammengesetzt (einfacher als den Quellcode zu holen und neu zu erstellen) und den Code entfernt, der bei internen/öffentlichen Feldern Fehler macht. LazyLoading scheint auch ohne diese Prüfung gut zu funktionieren. (Obwohl ich neu in NHibernate bin und es daher wahrscheinlich Szenarien gibt, von denen ich nichts weiß).

Editar: Es gibt eine Eigenschaft "use_proxy_validator", mit der alle Validierungsprüfungen deaktiviert werden können. Gut genug.

Fluently.Configure()
    .ExposeConfiguration(fun cfg -> 
        cfg.Properties.Add("use_proxy_validator", "false"))...

1 Stimmen

Für Spring.Net können Sie dies zu "HibernatedProperties" hinzufügen <entry key="use_proxy_validator" value="false" />

5voto

Ofir Punkte 71

Stellen Sie einfach die faule Eigenschaft auf false,

 <class name="OrderLine" table="OrderLine" lazy="false" >

können Sie mehr lesen in: Muss mit NHibernate alles virtuell sein? - http://davybrion.com/blog/2009/03/must-everything-be-virtual-with-nhibernate/

Ofir, www.TikalK.com

1voto

cwap Punkte 10738

Sie können die

[XmlIgnore]

Attribut zum Ausschmücken der Felder :)

0 Stimmen

Für NHibernate? Er ignorierte es und stürzte trotzdem ab.

0 Stimmen

Seltsam :S Ich habe es selbst für die gleiche Art von Problem verwendet. Vielleicht ist es, weil Sie FluentNHibernate verwenden

0 Stimmen

Oh, das nervt :(. Das wäre doch eine nette Lösung. (Obwohl, ich kann nicht wirklich Attribute auf diese Felder setzen). Haben Sie einen Verweis auf irgendwelche Dokumente, die zeigen, was XmlIgnore in NHibernate steuert? Vielen Dank!

1voto

MatthieuGD Punkte 4432

Können Sie eine Schnittstelle verwenden, um die Felder als "verwendet" zu deklarieren? http://nhibernate.info/doc/nh/en/index.html#persistent-classes-poco-sealed

"Eine andere Möglichkeit ist, dass die Klasse eine Schnittstelle implementiert, die alle öffentlichen Mitglieder deklariert"

Ich weiß nicht, ob NH die gleiche @transient-Annotation bzw. das gleiche @transient-Attribut wie die JAVA-Version verwendet, um eine Eigenschaft bei persistenten Operationen zu ignorieren.

0 Stimmen

F# hat keine implizite Schnittstellenimplementierung, und das eigentliche Feld hat einen vom Compiler generierten Namen. Aber ich mag den Gedanken.

0voto

Simon Broadhead Punkte 3433

Sie sollten einen Blick werfen auf diese Seite die einen Überblick über die Verwendung von F# mit Fluent NHibernate gibt.

Editar Ich habe gerade Ihren Benutzernamen bemerkt. Liege ich richtig in der Annahme, dass dies Ihr Blog ist? Wie dumm von mir. Es scheint jedoch auf Ihr Problem einzugehen, nämlich "Wir beginnen mit der Deaktivierung von LazyLoad, da die meisten Eigenschaften nicht virtuell sind und NHibernate das Mapping nicht validieren kann. Stattdessen laden wir Dinge wie die Store-Referenz explizit mit LazyLoad."? Vielleicht verstehe ich das Problem einfach falsch.

0 Stimmen

Genau das ist das Problem. Ich habe jetzt virtuelle Eigenschaften erstellt, aber ich habe keine Möglichkeit, die hinteren Felder privat zu machen. Ich möchte das Lazy Loading nicht deaktivieren, ich möchte, dass NHibernate es einfach hinnimmt :). Ich kann keinen technischen Grund erkennen, warum es nicht funktionieren sollte, außer dieser vorsichtigen Prüfung, die es hat.

0 Stimmen

Ich vermute, es hat mehr mit der Tatsache zu tun, dass die Proxies gar nicht erst erzeugt werden können, wenn es nicht-virtuelle Mitglieder gibt, da es sich zwangsläufig um eine Unterklasse handelt, die alle Mitglieder überschreibt. Leider bin ich nicht vertraut genug mit F#, um einen spezifischen Rat anzubieten.

0 Stimmen

Das können sie, sie können nur die Felder nicht außer Kraft setzen. Siehe meine Antwort.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X