2

In meiner Domäne haben ein Mitarbeiter und eine Abteilung eine Eins-zu-viele-bidirektionale Beziehung; Damit der untergeordnete Mitarbeiter dies synchronisieren kann, habe ich ein "internes" Zugriffsfeld für den Satz (Iesi für NHibernate) von Mitarbeitern in der Abteilung, die ansonsten nur öffentlich veröffentlicht würden. Wie so:bidirektionale Beziehungsmuster mit Nhibernate

Abteilung Klasse:

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-Klasse:

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

Ich habe Zugang in meinem (FNH) Mapping AsField (Prefix.Underscore), aber da ich kann das Department._staff-Feld nicht virtuell machen NH ist nicht glücklich. Ich schätze, ich könnte das Feld zu einer virtuellen Eigenschaft machen und zwingen, es zu füttern, aber das fühlt sich an, als würde ich der Domain-Klasse über die Persistenz bewusst machen.

Ich lerne sowohl NH und FNH und ich weiß, dass ich eine gute Grundierung in Beziehung Mapping benötigen, aber meine Hauptfrage für diesen Beitrag ist die Logik in meiner Domain-Klassen:
1) Ist das eine gute C# -Programmierung Muster für eine readonly in einer bideorectional Beziehung gesetzt?
2) Was ist der beste Weg, um dies für NHibernate besser nutzbar zu machen?

Danke für das Teilen!
Berryl

Antwort

11

ich implementieren eine Eins-zu-viele-Beziehungen dieses Muster verwenden:

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

In diesem Fall ist Abteilung der Kehrseite der Beziehung.

+0

Hallo Jamie Sorry für den späten Kredit fällig, da dies gut funktioniert. Denkst du, es wäre möglich, die Logik umzudrehen und den Stab ISet intern sichtbar zu machen? Wie würde das Mapping aussehen? Nochmals vielen Dank für die gute Antwort. – Berryl

+1

Ich musste den Abteilungs-Setter der Mitarbeiterklasse intern schützen, damit FluentNH ihn als gültigen Proxy-Typ akzeptierte, aber danach schien es gut zu funktionieren. – David

Verwandte Themen