2009-12-21 3 views
12

Fluent NHibernate mag dies nicht, einen Fehler zu werfen:Fließendes NHIbernate automapping der Liste <string>?

{"Association references unmapped class: System.String"}

OK in Ordnung, ich kann sehen, warum dies ein Problem verursachen würde - aber was ist die beste Lösung?

Ich möchte nicht wirklich eine begrenzte Liste von Zeichenfolgen in einem einzelnen Feld speichern, dies würde hässlich werden, wenn meine Liste viele Zeichenfolgen enthält.

Ich möchte auch nicht wirklich eine Tabelle 'String', aus offensichtlichen Gründen.

Ich denke, ich kann dies lösen, indem ich meine List<string> in eine Klasse einwickelt, aber das fühlt sich ein wenig Schwergewicht. Ich fange an zu denken, dass es die beste Lösung ist.

Was ist der beste Weg, Fluent NHibernate zu bekommen, damit umzugehen?

Ich erwarte völlig, dass diese Werte in einer anderen Tabelle gespeichert werden. Ich dachte vielleicht, dass ich in der Lage gewesen wäre, eine automatische Zuordnung Konvention, die NHibernate 'Wenn Sie eine class X, die List<*some primitive type*> enthält, dann weitermachen und automatisch erstellen eine Referenztabelle, die diese Sammlung zugeordnet ist.

Es fühlt sich ein bisschen schwer zu gehen und jede einzelne Sammlung in einer Klasse zu wickeln. Wenn das aber die beste Lösung ist, dann sei es so.

+1

Wenn Sie es nicht als getrennte Zeichenfolge in einem einzelnen Feld möchten und nicht in einer anderen Tabelle, dann * where *? Dies ist immer noch eine relationale Datenbank ... –

+0

Ich bin nicht gestört, wie die relationale Datenbank dies behandelt. Ich frage mich, wie ich das Automapping dazu bringen kann, dies abzuleiten, was ich für * alle * String-Listen in meinem Domain-Modell tun möchte. – Alex

+0

@Alex - Soweit ich weiß, gibt es keine Möglichkeit, Fluent NHibernate mitzuteilen, wie alle String-Listen abgebildet werden sollen. Die Lösung, die ich in meiner Antwort zur Verfügung stelle, erfordert eine Überschreibung für jede String-Liste in Ihrem Domänenmodell. Es ist nur ein paar Zeilen Code für jede Überschreibung, so ist es nicht so schlimm ... –

Antwort

7

Ich hatte genau dieses Problem ein paar Wochen zurück, mit Floats anstelle von Strings.

how-do-you-automap-listfloat-or-float-with-fluent-nhibernate

Es stellt sich heraus, dass Automapping nicht mit primitiven Typen funktioniert.

Bearbeiten - Das ist nicht mehr wahr - der FNH Team das Problem

fixiert hat

auf meine Frage in der akzeptierte Antwort eine Menge Beispielcode gibt es, aber der entscheidende Punkt ist, eine Überschreibung für Ihre hinzufügen Listen von primitiven Typen („Rawy“ im Beispiel unten):

public class DlsAppOverlordExportRunData 
{ 
    public virtual int Id { get; set; } 
    // Note: List<float> needs overrides in order to be mapped by NHibernate. 
    // See class DlsAppOverlordExportRunDataMap. 
    public virtual IList<float> RawY { get; set; } 
} 


// Must be in different namespace from DlsAppOverlordExportRunData!!! 
public class DlsAppOverlordExportRunDataMap : IAutoMappingOverride<DlsAppOverlordExportRunData> 
{ 
    public void Override(AutoMapping<DlsAppOverlordExportRunData> mapping) 
    { 
     // Creates table called "RawY", with primary key 
     // "DlsAppOverlordExportRunData_Id", and numeric column "Value" 
     mapping.HasMany(x => x.RawY) 
       .Element("Value"); 
    } 
} 

ich würde der gleiche Ansatz erwarten mit ILists von Strings zu arbeiten.

+0

Ok das sieht interessant aus. Ist das etwas, das über Konventionen definiert werden kann? Es scheint, dass FNH sich auf Konventionen konzentriert, um das Auto-Mapping anzupassen. – Alex

+0

Ich glaube nicht. Ich habe die Lösung gefunden, indem ich die Frage auf der Fluent-Mailingliste gestellt habe, und glaube, dass es einer der FNH-Autoren war, die es mir gegeben haben. Wenn es durch eine einzige Konvention geschehen könnte, hätte er das vorgeschlagen. –

1

Denken Sie auf diese Weise ... wie würden Sie es ohne Winterschlaf tun? Nun, Sie hätten wahrscheinlich eine Tabelle mit einer Fremdschlüssel- und Stringspalte? Nun, wie machst du das mit Hibernate? Sie richten eine andere Klasse mit einer Eins-zu-eins-Eigenschaft und einer Zeichenfolgeneigenschaft ein. Dann ordnen Sie eine Sammlung dieser Klasse zu.

+0

Ok, Punkt genommen. Ich mag es einfach nicht, all diese völlig trivialen Klassen zu erstellen, um primitive Sammlungen zu umhüllen. Kann ich das Automapping für mich schließen lassen? – Alex

+0

Oh, du musst also keine andere Klasse erstellen? Ich denke, das ist möglich ... http: //nhforge.org/doc/nh/en/index.html#collections-ofvalues ​​sehen, wie sie ein Beispiel für eine Reihe von Ints gab, sieht aus wie Sie eine regelmäßige Sammlung dann definieren ein Elementeigenschaft für Ihre Zeichenfolge. – dotjoe

4

Seit ich meine erste Antwort geschrieben habe, hat das Fluent NHibernate-Team dieses Problem behoben.

Sie können jetzt ILists von C# -Werttypen (Strings, Ints, Floats usw.) automatisieren.

Stellen Sie sicher, dass Sie eine aktuelle Version von FNH haben.

+0

Achja, das ist fast ein Jahr zu spät für meine Bedürfnisse - egal wie schön es ist, dass FNH dies implementiert hat, es war die einzige wirkliche Hürde, die ich bei der Verwendung für eine große LOB-App hatte. – Alex

+0

Kudos Tom, dass er ein Jahr später zurück gekommen ist, um dieses Update zur Verfügung zu stellen. – MushinNoShin