0

私は、2つのオブジェクトEmployeeとDepartmentのデータモデルを作成しています。従業員には部門のリストがあり、部門には従業員のリストがあります。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);} 
     } 
    } 

どのように私はNHibernateはと同期して、それを作るために、Employeeクラスに部門クラスのaddEmployeeメソッドとAddDepartmentメソッドを書くのですか? 私はEmployeeクラス

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

    } 

でこれを書いたしかし、私は、誰かの助けをwork.Canするためにそれを期待どおりに動作しdoesntの。

+0

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 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マッピングは次のようになります私はこれらのシナリオをどのように処理するのかについて以下の例を掲載しましたが、なぜコードが期待?あなたは何を期待していますか? –

+0

db.session.Save(Employee)のようにこれを保存しようとすると、循環依存が発生します。それは部署を持つ従業員に再開し、部署内に従業員がいるなど..円形です。それが正しいかどうかはわかりません。間違っていると誰かが私を正すことができますか? – 8GB

答えて

1

これは私がこれらの関係をどのように処理するかの例です:私は

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

私はまったく同じ方法です。少なくとも、ボイラープレートコードとアプリケーションコードを分けて、単一の障害点を与えます。ユーザーを削除するための便利なメソッド(Add、Remove)をGroup-Classに追加することもできます。 –

+0

@SebastianEdelmeier、そのクラスにはメソッドがあります。 addとremoveの両方は、上記のコードの 'Group'のメソッドを呼び出します。 –

関連する問題