2

내 도메인에서 직원과 부서는 일대 다 양방향 관계를 가지고 있습니다. 자식 직원이이 작업을 동기화하게하려면 부서에있는 직원의 Set (Iesi for Hibernate)에 대한 '내부'액세스 필드가 있어야합니다. 그렇지 않으면 읽기 전용으로 공개됩니다. 그래서 같이 :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)에 접근을했다,하지만 난 이후 부서를 만들 수 없습니다 ._staff 필드 가상 NH는 행복하지 않습니다. 나는 필드를 가상의 속성으로 만들고 강제로 먹일 수 있다고 생각하지만, 도메인 클래스가 지나치게 지속성을 인식하도록 만드는 것처럼 느껴진다. 내가 NH 및 FNH와 내가 배우고

내가 관계 매핑에 좋은 프라이머를 필요로 알고 있지만,이 게시물에 대한 내 주요 질문은 내 도메인 클래스의 논리입니다 :
1)이 좋은 C# 프로그래밍 패턴 biderectional 관계에 설정된 읽기 전용?
2) 이것을 NHibernate에 더 유용하게 만드는 가장 좋은 방법은 무엇입니까?

공유해 주셔서 감사합니다.
Berryl

답변

11

를 I이 패턴을 사용하여 일대 다 관계를 구현이 경우

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 setter를 내부로 보호해야했지만 이후에는 제대로 작동하는 것으로 보였습니다. – David

관련 문제