0

Я создаю модель данных для двух объектов Сотрудник и отдел. У сотрудника есть список отделов, и у Департамента есть список сотрудников.как сохранить многие отношения во взаимодействии с nhibernate?

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);} 
     } 
    } 

Как написать AddEmployee метод в классе отдела и метод AddDepartment в классе Employee, чтобы сделать его в синхронизации с NHibernate? Я писал об этом в классе Employee

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

    } 

Но он не работает, как я ожидал, что это кто-то work.Can помощь.

+0

I опубликовали пример ниже о том, как я обрабатываю эти сценарии, но почему ваш код не работает как ожидается? Что вы ожидаете? –

+0

Это приводит к циклическим зависимостям, когда я пытаюсь сохранить это как db.session.Save (Employee); Он решает в Employee, имеющем отделы, и что отделы hasve сотрудников внутри и так далее. Это круговой. Я не уверен, что это правильно. Может кто-то исправить меня, если я ошибаюсь? – 8GB

ответ

1

Это пример того, как я обрабатывать эти отношения:

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); 
    } 
} 

Моих User отображения выглядит следующим образом:

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(); 
    } 
} 

Мое Group отображения выглядит следующим образом:

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

Я делаю это точно так же, по крайней мере, отделяет код шаблона от кода приложения и дает вам одну точку отказа. Вы можете даже добавить методы удобства (Добавить, удалить) в Group-Class для удаления пользователей. –

+0

@SebastianEdelmeier. Для этого есть методы в этом классе. Оба метода add и remove вызывают эти методы в «Группе» в приведенном выше коде. –