2017-04-20 4 views
0

Ich habe ein Problem beim Versuch, eine Beziehung in EF korrekt zu konfigurieren. Ich habe zuerst EF-Code verwendet, um Klassen aus einer bestehenden Datenbank zu generieren. Die erste Tabelle enthält eine Liste von Befehlen, die zweite eine Aufzeichnung des Staates hält, dass jeder Befehl in istSo erstellen Sie eine Beziehung 0..1-1 in EF6

Tables (vereinfacht):.

Instruction 
----------- 
InstructionID 
CurrentInstructionStateHistoryID 

InstructionStateHistory 
----------------------- 
InstructionStateHistoryID 
InstructionID 
State 

So kann man sehen, dass es zwei Beziehungen zwischen den Tabellen - eine 1-Viele Beziehung basierend auf AnweisungID, die mich nicht interessiert, und deshalb die Eigenschaften für gelöscht haben. Die zweite Beziehung basiert auf der CurrentInstructionStateHistoryID-Eigenschaft, die auf den "aktuellen" Status der Anweisung verweist.

Die Klassen sind wie folgt:

public partial class Instruction 
{ 
    [Key] 
    public int InstructionID { get; set; } 

    public int? CurrentInstructionStateHistoryID { get; set; } 

    public virtual CurrentInstructionStateHistory InstructionStateHistory { get; set; } 

} 

public partial class InstructionStateHistory 
{ 
    [Key] 
    public int InstructionStateHistoryID { get; set; } 

    public int InstructionID { get; set; } 

    public string State { get; set; } 

    public virtual Instruction tblInstruction { get; set; } 
} 

Hier ist der fließend API-Setup, die Beziehung zu definieren:

modelBuilder.Entity<InstructionStateHistory>() 
     .HasRequired(e => e.tblInstruction) 
     .WithOptional(e => e.CurrentInstructionStateHistory); 

Also, das alles kompiliert und ausgeführt. Aber wenn ich auf ein Stück Code wie diese:

Instruction instruction = await _dal.InstructionRepository.Find(claimID); 
    InstructionStateHistory history = i.CurrentInstructionStateHistory; 

kann ich sehen, dass die Anweisung korrekt ausgefüllt ist, sagen wir, die Id 1234. ist, wenn ich das InstructionStateHistory Objekt untersuchen, was ich wollen sehen, ist, dass es InstructionID ist 1234, aber was ich sehe, ist, dass es InstructionStateHistoryID ist, dh ist Primärschlüssel, ist 1234 und dass es sich auf eine völlig andere Anweisung bezieht. Irgendwie muss ich EF mitteilen, dass Instruction.CurrentInstructionStateHistoryID mit InstructionStateHistory.InstructionStateHistoryID verknüpft ist. Ich habe viele Kombinationen von Datenannotationen und flüssigem Setup ausprobiert, konnte aber keine Kombination finden, die tatsächlich funktioniert, entweder bekomme ich das obige Ergebnis oder einen Laufzeitfehler. Jede Hilfe wurde dankbar angenommen!

Antwort

0

Es sieht so aus, als könnte EF diesen Fall nicht verarbeiten, also war die Lösung, das Konzept eines "aktuellen" InstructionStateHistory zu vergessen. Stattdessen habe ich ein Datumsfeld auf die InstructionStateHistory Tabelle, und verändert dann die Befehlsklasse eine regelmäßige Sammlung Eigenschaft zu haben, wie folgt:

public virtual ICollection<InstructionStateHistory> InstructionStateHistories{ get; set; } 

Dann, wenn ich den „aktuellen“ Zustand muss nur ich die colection abfragen, sortiert nach Datum und nehmen Sie das neueste.

Verwandte Themen