2009-04-12 15 views
18

Ich habe einige Entitätstypen, die ich gerne laden würde. Sie haben jedoch einige interne Felder (Assembly), die sie verfügbar machen, die jedoch außerhalb dieser Klasse nicht verwendet werden. Diese Felder sind Compiler generiert (F #) und ich kann sie nicht ändern. Das ein Beispiel Ausnahme ist:Ignorieren öffentliche/interne Felder für NHibernate-Proxy

NHibernate.InvalidProxyTypeException: Folgende Typen können nicht als Proxies verwendet werden: Mappings.MTest: Feld-ID @ 47 nicht öffentlich sein soll, noch interne

I Verstehen Sie, warum NHibernate dies tut, und wie die Verwendung von Feldern bei einem Zugriff darauf die Lazy-Loading-Eigenschaften der generierten Proxies durcheinander bringen würde. Da ich jedoch weiß, dass ich die Felder nicht verwenden werde, kann ich den NHibernate irgendwie überschreiben?

Gibt es eine Möglichkeit, wie ich "dieses Feld ignorieren" sagen kann? Ich verwende Fluent NHibernate, wenn das einfacher ist.

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

Edit2: Das Haupt Kern dabei ist, dass ich behalten wollen Lazy Loading aktiviert, was bedeutet, dass ich die Proxy-Generierung verwenden . Deaktivieren von LazyLoading funktioniert (keine Proxies), aber sorta vereitelt den Zweck eines netten Frameworks wie NHibernate.

Antwort

16

ich NHibernate (einfacher, als sich die Quelle und Wiederaufbau) zusammengesetzt und entfernt den Code, den Fehler auf der internen/öffentlichen Bereichen. LazyLoading scheint ohne diese Überprüfung gut zu funktionieren. (Obwohl, ich bin neu in NHibernate und so gibt es wahrscheinlich Szenarien Ich weiß nicht, über.)

Edit: Ah, da ist eine Eigenschaft, „use_proxy_validator“, der alle Validierungsprüfungen deaktivieren wird. Gut genug.

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

dies funktioniert! für Spring.Net können Sie dies zu "HibernatedProperties" hinzufügen '' –

0

Vielleicht möchten Sie einen Blick auf this page werfen, die einen Überblick über die Verwendung von F # mit Fluent NHibernate gibt.

Bearbeiten Ich habe gerade Ihren Benutzernamen bemerkt. Habe ich Recht, wenn ich vielleicht daran denke, dass dies dein Blog ist? Wie dumm von mir. Es scheint jedoch, Ihr Problem zu beheben, insbesondere "Wir beginnen damit, LazyLoad zu deaktivieren, da die meisten Eigenschaften nicht virtuell sind und NHibernate das Mapping nicht überprüfen kann. Stattdessen laden wir ausdrücklich LazyLoad-Dinge, wie die Store-Referenz."? Vielleicht verstehe ich das Problem nur falsch.

+0

Das ist genau das Problem. Ich habe jetzt virtuelle Eigenschaften erstellt, aber ich habe keine Möglichkeit, die Hintergrundfelder privat zu machen. Ich möchte das Lazy Loading nicht deaktivieren, ich möchte, dass NHibernate das einfach hinnimmt :). Ich kann keinen technischen Grund sehen, dass es nicht funktionieren wird, außer für diese vorsichtige Überprüfung, die es hat. – MichaelGG

+0

Ich denke, es hat mehr damit zu tun, dass die Proxies überhaupt nicht erst erzeugt werden können, wenn es nicht-virtuelle Mitglieder gibt, da es notwendigerweise eine Unterklasse ist, die alle Mitglieder überschreibt. Leider bin ich mit F # nicht vertraut genug, um spezifische Ratschläge zu geben. –

+0

Sie können die Felder natürlich nicht außer Kraft setzen. Siehe meine Antwort. – MichaelGG

1

Sie können das

[XmlIgnore] 

Attribut um die Felder dekorieren :)

+0

Für NHibernate? Es ignorierte es und stürzte immer noch ab. – MichaelGG

+0

Seltsam: S Ich habe es selbst für das gleiche Problem benutzt. Vielleicht liegt es daran, dass Sie FluentNHibernate benutzen .. – cwap

+0

Oh, das saugt :(. Es wäre eine süße Lösung. (Obwohl ich kann nicht wirklich Attribute auf diese Felder setzen.) Haben Sie einen Verweis auf alle Dokumente zeigen, was XmlIgnore steuert in NHibernate? Danke! – MichaelGG

1

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

„Eine andere Möglichkeit ist für die Klasse eine Schnittstelle zu implementieren, die alle öffentlichen Mitglieder erklärt“

Ich weiß nicht, ob NH die gleiche @transient Anmerkung/Attribut als JAVA-Version verwenden, um eine Eigenschaft in ignorieren persistente Operationen. Everything Must Virtuelle sein mit NHibernate:

+0

F # hat keine implizite Schnittstellenimplementierung, und das tatsächliche Feld hat einen Compiler generierten Namen. Aber ich mag das Denken. – MichaelGG