5

Ich habe ein wenig Streit mit meinem Kollegen, dass ich nicht scheinen kann, eine Antwort zu finden, aber das ist sehr grundlegende Sachen.Ein-zu-viele-Beziehung mit Fluent Nhibernate einrichten

Erstellen einer Eins-zu-viele-Beziehung in Fluent Nhibernate entity.

Nehmen wir zum Beispiel Rollen und Benutzer. Eine Rolle kann mehrere Benutzer zugeordnet werden, damit ich meine Einheit Mut gemacht wie folgt aussieht:

public class User 
{ 
    [Required] 
    public virtual string FirstName { get; set; } 
    public virtual Role Role { get; set; } 
} 

und Rolle

public class Role 
{ 
    [Required] 
    public virtual string Name { get; set; } 
    public virtual IList<User> Users{ get; set; } 

    public Role() 
    { 
     Users = new List<Users>(); 
    } 
} 

Wie man sehen kann ich Referenzierung eine Sammlung von Benutzern in Rollen, Art sagen, dass jede Rolle mehrere Benutzer haben wird. Für die Benutzerentität muss diese Rollenentitätsreferenz verwendet werden, um zu ermitteln, welcher Rolle ein Benutzer angehört.

Meiner Meinung nach ist dies die richtige Art zu verlinken, und mein Kollege sagt, dass eine Role Referenz für Benutzer eine zirkuläre Referenz erstellen wird. Wer hat Recht?

Ich habe versucht, die Antwort online zu finden. Ich denke, diese Frage mir sagt, dass ich recht habe: Fluent NHibernate Many to one mapping

Aber dann sah ich an einem Fuent Nhibernate Beispielprojekt hier https://github.com/jagregory/fluent-nhibernate/tree/master/src/Examples.FirstAutomappedProject/Entities und ich nicht ein Beispiel dafür, was ich versuche zu implementieren. Können Sie mir helfen, ein Dokument zu finden, das den richtigen Weg erklärt? Habe ich recht? Danke.

Antwort

12

Was Sie hier vorschlagen, ist innerhalb des nHibernate-Frameworks vollständig möglich und zulässig. Offensichtlich haben Sie die Modelle und nicht die Zuordnungsdateien aufgelistet, aber Fluent nHibernate ermöglicht Ihnen, Ihre Zuordnungen auf diese Weise ohne Probleme zu konfigurieren.

Ob Sie tatsächlich eine Beziehung auf diese Weise zuordnen möchten, hängt ganz von den persönlichen Präferenzen und dem spezifischen Szenario ab. Ich habe Modelle auf diese Weise abgebildet, aber ich habe mich auch nicht dafür entschieden, vor allem, weil es in manchen Fällen nicht sinnvoll ist, den Objektgraphen übermäßig zu komplizieren. Nehmen Sie zum Beispiel eine Nachschlagetabelle (z. B. Culture oder Locale), die mehrfach auf mehrere Tabellen in einer Datenbank referenziert wird. Wenn Sie dies zuordnen, hätte ich in jedem der übergeordneten Modelle eine Culture-Eigenschaft, aber keine Sammlungen von übergeordneten Objekten im Kulturmodell - es macht einfach keinen Sinn.

Sie müssen auch das Laden von Daten über Ihre Persistenzschicht in Erwägung ziehen - wenn Sie diese Art von Beziehung erstellen und nur eine einfache Liste von Rollen benötigen, die Sie berücksichtigen müssen oder wenn die Benutzersammlung ausgefüllt wird, können Sie eisery angeben oder spätes Laden, aber nach meiner Erfahrung kann das Angeben des Eager-Ladens mit einem entsprechenden Fetch-Befehl in den Abfragen zu einem optimierten Aufruf der Datenbank führen.

Grundsätzlich, was ich sage ist, dass es keinen absoluten "richtigen Weg" gibt, wenn Sie entscheiden, wie Sie Ihre Zuordnungen definieren - Sie müssen wirklich ein reiches Objektmodell vs. Abfrageleistung ausbalancieren, aber Ihr spezifisches Beispiel ist vollkommen akzeptabel brauchen.

Ich habe gerade Ihre Frage erneut gelesen und ich bin mir nicht sicher, ob Sie auch Beispiele für auf diese Weise konfigurierte Mappings benötigen. Wenn Sie also ein paar Beispiele haben wollen, lassen Sie es mich wissen und ich werde einige für Sie zusammenstellen.

Um die Beziehung zu erreichen Sie beschreiben Sie die folgenden Karten Klassen müssen (ich habe Id Eigenschaften hinzugefügt, wie ich Sie diejenigen haben erraten):

Für die Rollen:

public class RoleMap : ClassMap<Role> 
{ 
    public RoleMap() 
    { 
      Table(@"Roles"); 
      Id(x => x.Id).GeneratedBy.Assigned(); 
      Map(x => x.Name).Column("Name"); 
      HasMany<User>(x => x.Users) 
      .Inverse() 
      .KeyColumns.Add("RoleId", mapping => mapping.Name("RoleId")); 
    } 
} 

Für den Benutzer:

public class UserMap : ClassMap<User> 
{ 
    public UserMap() 
    { 
      Table(@"Users"); 
      Id(x => x.Id).GeneratedBy.Assigned(); 
      Map(x => x.FirstName); 
      Map(x => x.RoleId);  
      References(x => x.Role) 
      .Class<Role>() 
      .Columns("RoleId"); 
    } 
} 

würde ich nicht gehängt bekommen auch oben auf „Ihre Methode vs ihre Methode“ - die oben ist durchaus akzeptabel, und hängt von Ihren Anforderungen, wenn Sie kommen die o verwenden bject Modell in Ihrem Code. Wenn Sie keine Benutzersammlung in der Rollenzuordnung möchten, entfernen Sie diese Eigenschaft und die zugehörige HasMany-Zuordnungsdeklaration. Beachten Sie, dass die .Inverse() -Spezifikation die Verwaltung der Beziehung zwischen einer Rolle und einem Benutzer an die Entität Benutzer delegiert hat, was im Grunde als Prozess des Hinzufügens oder Bearbeitens eines vorhandenen Benutzers und Bereitstellen einer RoleId sinnvoll ist wird die Beziehung schmieden.

Hope this etwas hilft, wenn Sie weitere spezielle Fragen haben lassen Sie mich wissen

+0

Ich würde es sehr begrüßen, wenn Sie mir ein Beispiel für eine Art „meine Art und Weise gegen die anderen Möglichkeiten“ zeigen konnte. – Shenaniganz

+0

Kein Problem, ich werde einige Beispiele später für Sie veröffentlichen – CSL

+1

Meine Antwort aktualisiert, um ein paar Beispielkarten für Sie zu enthalten – CSL