2009-08-17 10 views
4

Wie kann ich mit fließendem NHibernate-Mapping für eine Tabelle angeben, die keine Identitätsspalte hat?Fließend nHibernate keine Identitätsspalte in Tabelle

Ich möchte etwas wie folgt aus:

public sealed class CustomerNewMap : ClassMap<CustomerNew>, IMap 
{ 
    public CustomerNewMap() 
    { 
     WithTable("customers_NEW"); 
     Not.LazyLoad(); 
     Not.Id(); // this is invalid... 
     Map(x => x.Username); 
     Map(x => x.Company); 
    } 
} 

Ich meine keinen Primärschlüssel in der Datenbank definiert (nicht viel in der Datenbank definiert sind).

Antwort

8

fand ich die Antwort zu sein:

public CustomerNewMap() 
    { 
     WithTable("customers_NEW"); 
     Not.LazyLoad(); 
     Id(x => x.Username).GeneratedBy.Assigned(); 
     Map(x => x.Company); 
    } 
+4

Wenn ich versuche, alle Objekte mit dem gleichen Schlüssel (in Ihrem Beispiel x.Username) sind tatsächlich Kopien der ersten, die aus der DB abgerufen wird. – blindmeis

0

Ich fand ich einen Spaltennamen in einem ähnlichen Fall explizit festgelegt hatte. So etwas wie

Id(x => x.Username).Column("Username").GeneratedBy.Assigned(); 
2

Dies beantwortet nicht direkt die Frage .. aber es beantwortet das Problem im Kommentar zur angenommenen Antwort hier.

Wir hatten das gleiche Problem mit einer SQL-Ansicht über unser Ledger. Das Problem besteht darin, dass NHibernate Zeilen erfolgreich dupliziert, wenn die Eigenschaft Id nicht eindeutig ist. In unserem Fall hatten wir Ledger-Einträge, die CustomerAccountId als Id eingestellt hatten. Das war innerhalb der Ansicht nicht eindeutig. Um das zu umgehen ... habe ich eine CompositeId erstellt, die auf dem basiert, was ich gefunden habe, was die Zeile einzigartig gemacht hat. In unserem Fall war es eine Kombination aus CustomerAccountId und WeekEnding:

CompositeId() 
    .KeyProperty(x => x.CustomerAccountId) 
    .KeyProperty(x => x.WeekEnding); 

Das war genug, um NHibernate Duplikate nicht zuordnen.

Verwandte Themen