2009-11-12 5 views
5

Ich möchte eine Viele-zu-viele-Beziehung erstellen, aber ich möchte in der neuen Tabelle (MessageReceivers) eine eindeutige Einschränkung in beiden Spalten haben (AdvanceMessageId, Benutzer-ID):Fluent-NHibernate: Wie erstellt man eine Viele-zu-Viele-Beziehung mit einem eindeutigen Contraint

mapping.HasManyToMany(x => x.Receivers) 
     .WithParentKeyColumn("AdvanceMessageId") 
     .WithChildKeyColumn("UserId") 
     .Cascade.All() 
     .LazyLoad() 
     .WithTableName("MessageReceivers"); 

Vielen Dank für Hilfe

Antwort

5

Alte Post ... aber falls jemand anderes kommt hier auf der Suche nach der Antwort:

Sie müssen der HasManyToMany-Mapping-Definition .AsSet() hinzufügen.


d.h.

mapping.HasManyToMany(x => x.Users) 
     .WithTableName("MessageReceivers") 
     .WithParentKeyColumn("UserId") 
     .WithChildKeyColumn("AdvanceMessageId") 
     .Inverse().AsSet(); 

Dies wird Setup eine einzigartige, zusammengesetzte Primärschlüsseleinschränkung auf der Link-Tabelle, die die beiden Spalten verwendet. (Clustered-Index)

Die untere Seite ist AsSet() kann nicht mit Auflistungseigenschaften vom Typ IList verwendet werden, also keine for-Schleifen ohne Casting.

Ich habe ICollection und instanziieren sie als HashSet für meine Anwendungen und es funktioniert gut.


Weitere Informationen über das Management von Sammlungen mit Fluent NHibernate:

Liste: geordnete Sammlung von Entitäten, doppelte erlaubt. Verwenden Sie eine .net IList im Code. Die Indexspalte muss in NHibernate zugeordnet werden.

Set: Ungeordnete Sammlung von eindeutigen Entitäten, Duplikate nicht erlaubt. Verwenden Sie Iesi.Collection.ISet im Code. Es ist wichtig, GetHashCode und Equals zu überschreiben, um die Geschäftsdefinition von duplicate anzugeben. Kann sortiert werden, indem eine Reihenfolge definiert wird oder indem ein Vergleicher definiert wird, der zu einem SortedSet-Ergebnis führt.

Tasche: Ungeordnete Liste von Entitäten, Duplikate zulässig. Verwenden Sie eine .net IList im Code. Die Indexspalte der Liste wird nicht zugeordnet und von NHibernate nicht berücksichtigt.

+0

Sehr wertvolle Information; danke für das Teilen. – contactmatt

2

sollten Sie bilden auch die umgekehrte Seite der Beziehung wie

mapping.HasManyToMany(x => x.Users) 
     .WithTableName("MessageReceivers") 
     .WithParentKeyColumn("UserId") 
     .WithChildKeyColumn("AdvanceMessageId") 
     .Inverse(); 

In neuesten Fluent NHibernate werden Sie ändern müssen

  • WithTableName -> Tabelle

  • WithParentKeyColumn -> ParentKeyColumn

  • WithChildKeyColumn -> ChildKeyColumn

Verwandte Themen