2 Stimmen

bidirektionale Beziehungsmuster mit nhibernate

In meiner Domäne haben ein Mitarbeiter und eine Abteilung eine bidirektionale Eins-zu-Viel-Beziehung; damit der untergeordnete Mitarbeiter dies synchronisieren kann, habe ich ein "internes" Zugriffsfeld für die Menge (Iesi für NHibernate) der Mitarbeiter, die in der Abteilung sind, die sonst nur lesend öffentlich sein würde. Etwa so:

Klasse der Abteilung:

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

Angestelltenklasse:

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

Ich habe den Zugriff in meinem (FNH) Mapping AsField(Prefix.Underscore), aber da ich das Feld Department._staff nicht virtuell machen kann, ist NH nicht glücklich. Ich schätze, ich könnte das Feld zu einer virtuellen Eigenschaft machen und es zwangsweise zuweisen, aber das fühlt sich an, als würde ich die Domänenklasse zu sehr auf die Persistenz aufmerksam machen.

Ich lerne sowohl NH als auch FNH, und ich weiß, dass ich einen guten Grundkurs in Relationship Mapping brauche, aber meine primäre Frage für diesen Beitrag ist die Logik in meinen Domänenklassen:
1) Ist dies eine gute c# Programmierung Muster für eine schreibgeschützte Menge in einer biderektionalen Beziehung?
2) Was ist der beste Weg, um dies für NHibernate besser nutzbar zu machen?

Danke für den Austausch!
Berryl

11voto

Jamie Ide Punkte 46985

Ich implementiere Eins-zu-Viel-Beziehungen nach diesem Muster:

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 die Abteilung die umgekehrte Seite der Beziehung.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X