2009-08-26 8 views
9

Ich bin neu in NHibernate und Fluent NHibernate.Fließendes NHibernate Mapping

Angenommen, ich habe eine Situation wie die folgenden

Table Activities (uniquidentier ID, varchar ActivityName) 
Table ActivityParameters(uniqueidentifier ID, varchar ParameterName, 
varbinary(8000) ParameterValue) 

und die folgende Klasse

public static Acivity 
{ 
    ....... 
    public virtual Guid Id {get; private set;}  
    public virtual string ActivityName {get; private set;} 
    public virtual IDictionary<string, object> ActivityParameters {get; private set;} 
} 

wie kann ich die classmap schreiben? Genauer gesagt, wie kann ich das Mapping für Aktivitätsparameter schreiben?

Antwort

16

ein Kollege e this site hingewiesen.

auf der Grundlage dieser Diskussion, ich komme zu

Table("Activities"); 
     Id(x => x.Id).Column("ID").GeneratedBy.Guid(); 
     Map(x => x.ActivityName).Not.Nullable().Length(50); 
     HasMany(x => x.ActivityParameters) 
      .KeyColumn("ActivityID") 
      .AsMap<string>(idx => idx.Column("ParameterName"), elem => elem.Column("ParameterValue")) 
      .Not.LazyLoad() 
      .ForeignKeyCascadeOnDelete() 
      .Table("ActivityParameters"); 

Ich muss das testen.

+0

Es funktioniert !!! Danke euch allen für die Richtung! – DaeMoohn

+3

Ausgezeichnete Arbeit mit Ihrer eigenen Lösung. Dafür abstimmen ... – Skittles

0

This scheint hilfreich zu sein.

Theoretisch sollte es so aussehen:

public class ActivityClassMap : ClassMap<Activity> 
{ 
    ... 
    HasMany(x => x.ActivityParameters) 
     .AsMap(x=>x.NameOfParameterOrWhatever) 
     .KeyColumnNames.Add("ParameterId"); 
    ... 
} 

Aber das ist nur eine kleine Untersuchung über Google - ich dies in der Praxis nicht versucht.

Ps.s. Vergessen Sie nicht, die neueste Version zu holen.

WithTable("Activities"); 
Id(x => x.Id).ColumnName("ID").GeneratedBy.Guid(); 
Map(x => x.ActivityName).Not.Nullable().WithLengthOf(50); 
HasMany(x => x.ActivityParameters) 
     .Cascade.Delete() 
     .KeyColumnNames.Add("ActivityID") 
     .AsMap("ParameterName") 
     .AsMap("ParameterValue") 
     .WithTableName("ActivityParameters"); 

, aber ich erhalte eine Fehlermeldung, Verband Referenzen unmapped Klasse:

+0

Vielen Dank, ich werde es versuchen. Danke noch einmal! – DaeMoohn

0

Basierend auf Ihrem Hinweis, habe ich zu kommen System.Object. :(

Später bearbeiten: Ich habe die neueste Version von Fluent, und jetzt sieht der Code wie folgt aus:

Table("Activities"); 
     Id(x => x.Id).Column("ID").GeneratedBy.Guid(); 
     Map(x => x.ActivityName).Not.Nullable().Length(50); 
     HasMany(x => x.ActivityParameters) 
      .KeyColumn("ActivityID") 
      .ForeignKeyCascadeOnDelete() 
      .Table("ActivityParameters"); 
0

Sie müssen tatsächlich definieren, welche Art von Objekt Ihre Werteigenschaft in IDictionary enthält - NHibernate weiß nicht, wie abzubilden. Sie sollten eine bestimmte Klasse verwenden statt. Dann geben Sie die Zuordnung für diese Klasse auch.

-1

Bitte verzeihen Sie meine Unwissenheit.

Ich habe vor etwa 6 Monaten mit NHibernate gearbeitet und entschieden uns immer noch für das XML-Integrations-Mapping, dann kompilieren wir die XML-Mappings in der Bibliothek oder was auch immer.

Ist dies neu, um relationale Tabellen und Klassenobjekte direkt innerhalb des Codes zuzuordnen?

Ich habe gehört, dass dies irgendwie mit dem Entity Framework kommen kam, indem Sie die Zuordnung nur über jedem Element einer Klasse in eckigen Klammern angeben. Da Entity Framework nur für die Verwendung mit SQL Server gedacht war, konnten wir nicht daran denken, es zu verwenden, da wir in einer Multi-DB-Umgebung mit SQL Server, Oracle und SQLite arbeiteten.

Danke für jede Beleuchtung zu diesem Thema! :-)

+0

Dies ist ein alternativer Ansatz zum Schreiben von hbm.xml-Dateien. – DaeMoohn

+0

Danke für Ihre Antwort! Ich werde ein interessiertes Auge aus, wenn ich wieder mit NHibernate arbeiten. –