0

Ich erstelle Datenmodell für zwei Objekte Mitarbeiter und Abteilung. Mitarbeiter hat eine Liste von Abteilungen und Abteilung hat eine Liste von Mitarbeitern.Wie man viele zu vielen Beziehungen synchron mit Nhibernate hält?

class Employee{ 
      private IList<Department> _departments; 
     public Employee() 
     { 
      _departments = new List<Department>(); 
     } 
     public virtual ReadOnlyCollection<Department> Departments{ 
      get {return new ReadOnlyCollection<Department>(_departments);} 
     } 
    } 

    class Department{ 
      private IList<Employee> _employees; 
     public Department() 
     { 
      _departments = new List<Employee>(); 
     } 
     public virtual ReadOnlyCollection<Employee> Employees{ 
      get {return new ReadOnlyCollection<Employee>(_employees);} 
     } 
    } 

Wie schreibe ich AddEmployee Methode in der Abteilung Klasse und AddDepartment Methode in Klasse Employee es synchron mit nHibernate zu machen? Ich schrieb dies in Klasse Employee

 public virtual void AddDepartment(Department department) 
    { 
     if (!department.Employees.Contains(this)) 
     { 
      department.Employees.Add(this); 
     } 
     _departments.Add(department); 

    } 

Aber es funktioniert nicht, wie ich es erwartet jemand Hilfe work.Can.

+0

I habe unten ein Beispiel geschrieben, wie ich mit diesen Szenarien umgehe, aber warum funktioniert dein Code nicht? erwartet? Was erwarten Sie? –

+0

Es führt zu zirkulären Abhängigkeiten, wenn ich versuche, dies zu speichern wie db.session.Save (Employee); Es ist in Mitarbeiter mit Abteilungen und Abteilungen hat Mitarbeiter innerhalb und so weiter. Es ist rund. Ich bin mir nicht sicher, ob das stimmt. Kann mich jemand korrigieren, wenn ich falsch liege? – 8GB

Antwort

1

Dies ist ein Beispiel dafür, wie ich diese Beziehungen handhaben:

public class User 
{ 
    private IList<Group> groups; 
    public virtual IEnumerable<Group> Groups { get { return groups.Select(x => x); } } 

    public virtual void AddGroup(Group group) 
    { 
     if (this.groups.Contains(group)) 
      return; 

     this.groups.Add(group); 
     group.AddUser(this); 
    } 

    public virtual void RemoveGroup(Group group) 
    { 
     if (!this.groups.Contains(group)) 
      return; 

     this.groups.Remove(group); 
     group.RemoveUser(this); 
    } 
} 

Mein User Mapping wie folgt aussieht:

public class UserMap : ClassMap<User> 
{ 
    public UserMap() 
    { 
     //Id, Table etc have been omitted 

     HasManyToMany(x => x.Groups) 
      .Table("USER_GROUP_COMPOSITE") 
      .ParentKeyColumn("USER_ID") 
      .ChildKeyColumn("GROUP_ID") 
      .Access.CamelCaseField() 
      .Cascade.SaveUpdate() 
      .Inverse() 
      .FetchType.Join(); 
    } 
} 

Mein Group Mapping wie folgt aussieht:

public class GroupMap : ClassMap<Group> 
{ 
    public GroupMap() 
    { 
     //Id, Table etc have been omitted 

     HasManyToMany(x => x.Users) 
      .Table("USER_GROUP_COMPOSITE") 
      .ParentKeyColumn("GROUP_ID") 
      .ChildKeyColumn("USER_ID") 
      .Access.CamelCaseField(); 
    } 
} 
+0

Ich mache es genau so, zumindest trennt das den Boilerplate-Code vom Anwendungscode und gibt Ihnen einen einzigen Fehlerpunkt. Sie können sogar Komfortmethoden (Hinzufügen, Entfernen) zur Gruppenklasse hinzufügen, um Benutzer zu entfernen. –

+0

@SebastianEdelmeier, es gibt Methoden in dieser Klasse, um das zu tun. Sowohl add als auch remove rufen diese Methoden in 'Group' im obigen Code auf. –