2013-05-30 9 views
5

ich eine Situation ähnlich der in Fluent NHibernate Mapping not on PK FieldFluent NHibernate-Mapping auf mehrere nicht-PK Felder

jedoch beschrieben haben, ist die Beziehung zwischen meiner Tabellen von mehreren Nicht-Primärschlüsselspalten beschrieben. Stellen Sie sich vor Chris Meek Situation aber, wo ein Person eine JobType und eine Code, die zusammen sollte (sorry, es ist eine Legacy-Datenbank) eindeutig beschreiben ein Person

Person 
------ 
Id PK 
JobType 
Code 
Name 

Order 
----- 
Id PK 
Person_JobType 
Person_Code 
OrderDetails 

Serhat Özgel der answer beschreibt PropertyRef, aber ich kann keinen Weg finden, dies für mehrere Spalten einzeln zu tun. Ich habe ähnliche versuchte

class PersonMap : ClassMap<Person> 
{ 
    public PersonMap() 
    { 
     HasMany(p => p.Order) 
      .KeyColumns.Add("Person_JobType") 
      .PropertyRef("JobType") 
      .KeyColumns.Add("Person_Code") 
      .PropertyRef("Code") 
    } 
} 

Aber dies offensichtlich nicht funktionieren, da KeyColumns.Add() kehrt eine andere OneToManyPart so wird PropertyRef() nicht gegen die einzelnen Spalte hinzugefügt wird ausgeführt werden. Die zweite PropertyRef() einfach die erste überschreibt, und ich erhalte den folgenden Fehler:

NHibernate.MappingException : collection foreign key mapping 
has wrong number of columns: MyApp.Person.Order type: Int32 

ich auf den verschiedenen Überlastungen von KeyColumns.Add haben gesucht(),

public TParent Add(string name) 
public TParent Add(params string[] names) 
public TParent Add(string columnName, Action<ColumnPart> customColumnMapping) 
public TParent Add(ColumnMapping column) 

Insbesondere die letzten beiden, konnte aber keine Möglichkeit finden PropertyRef individuell einstellen für jede Spalte Ebene :( gibt es eine Möglichkeit, das zu tun? Bin ich dies über die falsche Art und Weise ganz

?

Antwort

3

mit hbm.xml und FluentNHibernate es möglich ist, mit beim rick

class PersonMap : ClassMap<Person> 
{ 
    public PersonMap() 
    { 
     Map(_ => JobTypeAndCode) 
      .Columns.Add("Person_JobType", "Person_Code") 
      .ReadOnly() 
      .LazyLoad() // optional: prevent loading the Columns twice 
      .Access.None(); 

     HasMany(p => p.Orders) 
      .KeyColumns.Add("Person_JobType", "Person_Code") 
      .PropertyRef("JobTypeAndCode") 
    } 

    private object JobTypeAndCode { get; set; } // FakeProperty 
} 

Anmerkung: Ich habe nie diese NHibernate MappingByCode mit arbeiten

+0

Wow, nice. Was ich dabei getan habe, war, dass ich keine NHibernate-Mapping zwischen diesen Klassen hatte und nur die Werte extrahierte und sie zurück ins Repository der anderen Klasse warf, um bei Bedarf die richtigen Datensätze zu erhalten - ziemlich hässlich. Ich wünschte, ich wüsste deinen Trick letzte Woche :) –

+0

Dies ist der Fehler, den ich bekam, während ich diesen Ansatz versuchte (konnte nicht vorbei): alle Zuordnungen dürfen nicht Teil einer Eigenschaft-ref sein – dreamerkumar

+0

@VishalKumar besser eine Frage stellen und einige posten Code? Sieht aus wie die Eigenschaft für die Eigenschaft ref ist eine referenzAny statt Karte – Firo