2

私のドメインでは、従業員と部署は1対多の双方向関係を持っています。子供の従業員がこれを同期できるようにするために、私はDepartment内のEmployeeのSet(Iesi for Hibernate)のための 'internal'アクセスフィールドを持っています。nhibernateを使用した双方向の関係パターン

部門クラス:

protected internal ISet<Employee> _staff; 
public virtual ReadOnlyCollection<Employee> Staff { 
    get { return new List<Employee>(_staff).AsReadOnly(); } 
} 
public virtual void AddStaff(Employee emp) { 
    emp.Department = this; } 
} 

Employeeクラス:そう同様

private Department _department; 
public virtual Department Department { 
    set { 
     // check valid value, etc. 
     value._staff.Add(this); 
    } 
} 

私は(FNH)のマッピングAsField(Prefix.Underscore)にアクセスをしたが、I以来、 Department._staffフィールドの仮想NHを幸せではないことができません。フィールドを仮想的なプロパティにして強制的にフィードすることができると思いますが、ドメインクラスに永続性を過度に認識させているように感じます。

私はNHとFNHの両方を学んでいますが、私は関係マッピングで良いプライマーが必要だと知っていますが、私の主な質問は私のドメインクラスのロジックです:
1)これは良いC#プログラミングパターンですか? biderectional関係で読み取り専用に設定されていますか?
2)これをNHibernateでより使いやすくするための最良の方法は何ですか?

共有いただきありがとうございます。
Berryl

答えて

11

を、私はこのパターンを使用して1対多の関係を実装します。この場合

public class Department 
{ 
    private IList<Employee> _staff = new List<Staff>(); 

    public virtual IEnumerable<Employee> Staff 
    { 
     get { return _staff; } 
    } 

    // Add and Remove have additional checks in them as needed 

    public virtual void AddStaff(Employee staff) 
    { 
     staff.Department = this; 
     _staff.Add(staff); 
    } 

    public virtual void RemoveStaff(Employee staff) 
    { 
     staff.Department = null; 
     _staff.Remove(staff); 
    } 
} 

 

public class Employee 
{ 
    public virtual Department Department { get; internal set; } 
} 

は、部門は、関係の逆側です。

+0

こんにちはジェイミー 申し訳ありませんが、これはうまく動作します。ロジックを反転して_staff ISetを内部的に見ることができると思いますか?もしそうならマッピングはどのように見えますか? 良い返答をしてくれてありがとう。 – Berryl

+1

私は、有効なプロキシタイプとしてそれを受け入れるために、FluentNHにEmployeeクラスのDepartmentセッターを内部で保護させなければなりませんでしたが、その後はうまくいくように見えました。 – David

関連する問題