5 Stimmen

Eins-zu-Null/Eins-Beziehung (Code First)

Ich werde diesen Kurs ausprobieren:

public class Person
{
    public int PersonID { get; set; }
    public string Name { get; set; }
    public int SpouseID { get; set; }
    public virtual Person Spouse { get; set; }
}

Die Beziehung ist: Eine Person hat einen oder null Ehepartner / Ein Ehepartner hat eine erforderliche Person

Ist es möglich, dieses Modell in Fluent API zu erstellen?

Gracias.

6voto

Ladislav Mrnka Punkte 355028

Leider ist es nicht möglich, eine echte selbstreferenzierende Eins-zu-Eins-Beziehung herzustellen, da EF derzeit keine eindeutigen Schlüssel unterstützt. Um diese echte selbstreferenzierende Eins-zu-Eins-Beziehung zu erstellen SpouseID muss als eindeutig gekennzeichnet sein. EF erlaubt Eins-zu-Eins nur bei Primärschlüsseln (der Primärschlüssel in der abhängigen Entität muss auch ein Fremdschlüssel zur Hauptentität sein), was bedeutet, dass eine selbstreferenzierende Eins-zu-Eins-Beziehung in PersonID <-> PersonID = zwei Entitäten mit gleichen PersonID in einer einzigen Tabelle. Das ist nicht möglich, weil PersonID ist ein Primärschlüssel und muss eindeutig sein.

Sie können es als one-to-many behandeln und nur eine einzelne Navigationseigenschaft freilegen, wie Sie wissen:

modelBuilder.Entity<Person>()
            .HasOptional(p => p.Spouse)
            .WithMany()
            .HasForeingKey(s => s.SpouseID);

Um eine Eins-zu-Eins-Beziehung in der Datenbank zu erzwingen, fügen Sie Folgendes hinzu benutzerdefinierter Datenbank-Initialisierer und erstellen Sie manuell einen eindeutigen Index für SpouseID Spalte.

Das Problem ist, dass es sich nur um eine Einwegnavigation handelt, so dass Sie den Ehepartner einer Person erreichen können, aber von diesem Spouse können Sie nicht zu Ihrem Ehemann zurückkehren.

2voto

Akash Kava Punkte 37863

Bei dieser Antwort handelt es sich um einen Vorschlag und nicht um eine genaue Antwort.

In der realen Welt ist dies kein korrektes Design, denn zunächst einmal hat jeder Ehepartner auch einen Ehepartner, der sich auf dieselbe Person bezieht, z. B. ist der Ehepartner des Ehepartners von Person selbst eine Person. Wir haben dies in unserer App als Persons und PeronRelations modelliert, PersonRelations haben FromPersonID, ToPersonID und Type Eigenschaft. Type spezifiziert "Husband<->Wife", "Wife<->Husband", "Father<->Son", "Son<->Father" usw.

public class Person{
   public int PersonID {get;set;}
   ...
   public ICollection<PersonRelations> FromRelations {get;set;}
   public ICollection<PersonRelations> ToRelations {get;set;}

}

public class PersonRelations{

   .. 
   public int FromPersonID {get;set;}
   public int ToPersonID {get;set;}

   public RelationType Type {get;set;} 
   public Person FromPerson {get;set;}
   public Person ToPersion {get;set;}

   // useful for Employment and Marriage 
   // durations
   public DateTime? Start {get;set;}
   public DateTime? End {get;set;}
}

public enum RelationType{
   Husband_Wife,
   Wife_Husband,
   Father_Son,
   Son_Father,
   Friend_Friend,
   Employee_Employer,
   Employer_Employee
}

Dies bietet Ihnen den Vorteil, dass Sie mehr Informationen pro Relation speichern und in beide Richtungen navigieren können, sowie viele Abfragen.

Jede Beziehung hat auch eine entsprechende Gegenbeziehung. Und Sie müssen eine zusätzliche Logik schreiben, um die richtige umgekehrte Beziehung zu erhalten, damit sie korrekt funktioniert.

Und dies ist in Entity Framework sehr einfach zu implementieren, da es sich um eine einfache One-to-Many-Beziehung handelt.

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