2009-06-20 9 views
7

angesichts der folgende Klassendefinition:Wie ordnen Sie eine Entität -> Interface-Beziehung mit Fluent NHibernate?

public class Order { 
    public IProduct Product {get;set;} 
} 

ich dieses (fließend) Mapping habe

References(x=>x.Product, "ProductId"); 

Und diese Ausnahme erhalten: Einen Verein aus der Tabelle Orders zu einer nicht zugeordneten Klasse bezeichnet, die wegen Sinn macht es weiß nicht, welche Umsetzung ich ihm geben werde.

Ich verstehe, warum ich den Typ im Mapping definieren muss (IProduct könnte alles sein), aber ich bin mir nicht sicher, wie es geht.

Danke,

Kyle

Antwort

2

Probieren Sie die Interface-Mapping IProduct anstelle der konkreten Klasse Product. (Hinweis: Ich spreche nicht über die Zuordnung des -Felds der Klasse Order.)

1

Sie könnten die Interface-> Implementierungsbeziehung als Vererbungsbeziehung abbilden, indem Sie ein geeignetes Vererbungsmodell verwenden.

Dies würde bedeuten, dass IProduct zugeordnet wird und dann eine Unterklassenzuordnung des Produkts im IProduct-Mapping erstellt wird, z. B. mithilfe von Tabelle-pro-Hierarchie.

Dadurch können Sie auch zusätzliche Daten in der Produktklasse zuordnen, die nicht Teil der IProduct-Schnittstelle ist, und Sie können auch zusätzliche IProduct-Implementierungen auf die gleiche Weise zuordnen, wenn Sie dies wünschen.

1

Ich habe daran gearbeitet, die Unterstützung für Proxy-Schnittstellen in Fluent zu verbessern. Es gab ein paar nützliche Patches, die an die Ausgaben 256 und 257 angehängt waren, aber sie benötigten wirklich alles, was manuell angegeben wurde. Ich habe diese einen Schritt weitergeführt und Unterstützung für das Festlegen von Proxies und das Ändern der Verweistypen von der abgeleiteten (die der Proxy wäre) in die zugrunde liegende zugeordnete Klasse hinzugefügt und eine neue Konvention (ProxyConvention) hinzugefügt, um alles automatisch einzurichten - Instantiieren Sie es einfach mit einer Funktion, um die Proxy-Schnittstelle von einer zugeordneten Klasse abzuleiten, und es sollte sich um den Rest kümmern.

Das eine Schlupfloch im Moment ist, dass es keine explizit in .hbm.xml-Dateien angegebenen Definitionen aufnehmen kann.

Der Patch ist an issue 256

5

Ich denke, was Sie suchen .References<Product>(x=>x.Product, "ProductId"); ist

übrigens das gleiche gilt für .HasMany<>

Dies scheint das gleiche wie <... class="Product" /> in xml zu tun

Ich würde nicht empfehlen, die Schnittstelle zuzuordnen, da es den ganzen Punkt der Verwendung von einem bricht - Sie stoßen auf Probleme, sobald es beginnt, IStorable und NH zu implementieren kann die Mehrfachvererbung nicht verkraften.

+0

Danke für diese Antwort - Ich fand es sehr hilfreich und war der Ansatz Ich wählte – Mike

+0

Warum der Typ "Frage"? – UpTheCreek

+0

Ups, guten Ruf, ich habe es geändert, es war ein Kopieren und Einfügen Fehler. – Stu

Verwandte Themen