2016-10-21 1 views
2

Diese Frage bezieht sich auf meine Original Question.EF-Junction-Tabelle mit zusätzlichen Id wirft Ausnahme auf Speichern

Ich habe es zur Arbeit, was schön ist, aber vor ein paar Sekunden bemerkte ich, dass es nicht 100% ist, was ich erwartet habe.

public class Entry{ 
    public IEnumerable<EntryHardware> RequestedHardware {get; set;} 
} 

public class EntryHardware{ 
    [Key] 
    [Column(Order=0)] 
    public int EntryId {get; set;} 
    [Key] 
    [Column(Order=1)] 
    public int HardwareId {get; set;} 
    public AdditionalProperty Foo {get; set;} 
} 

public class Hardware{ 
    public string Name {get; set;} 
} 

mit diesem Ansatz ein Eintrag n verschiedene Hardware aber das Hinzufügen der gleiche Hardware zweimal in einem nicht eindeutigen Id-Set führt enthalten.

Um dies zu lösen, habe ich eine neue einzigartige Immobilie zu meinem EntryHardware Modell:

public class EntryHardware{ 
    [Key] 
    [Column(Order=0)] 
    public int Id {get; set;} 
    [Key] 
    [Column(Order=1)] 
    public int EntryId {get; set;} 
    [Key] 
    [Column(Order=2)] 
    public int HardwareId {get; set;} 
    public AdditionalProperty Foo {get; set;} 
    public virtual Entry ... 
    public virtual Hardware ... 
} 

Leider auf diese Weise der Id-Eigenschaft wird nicht automatisch durch die DB-Set. Suche nach einer Antwort fand ich ein Attribut, das dieses Problem lösen sollte:

public class EntryHardware{ 
    [Key] 
    [Column(Order=0)] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id {get; set;} 
    [Key] 
    [Column(Order=1)] 
    public int EntryId {get; set;} 
    [Key] 
    [Column(Order=2)] 
    public int HardwareId {get; set;} 
    public AdditionalProperty Foo {get; set;} 
    public virtual Entry ... 
    public virtual Hardware ... 
} 

Aber mit diesen meinen Code throwns eine Ausnahme, wenn es um die Entitäten auf die DB zur Rettung kommt:

Shop aktualisieren, einfügen, Die Anweisung löschte eine unerwartete Anzahl von Zeilen (0). Entitäten wurden möglicherweise geändert oder gelöscht, seit Entitäten geladen wurden.

aber ich kann nicht herausfinden, wo das Problem liegt hier ....

+0

Stop und einen Schritt zurück .... Was versuchen Sie zu erreichen? Warum geben Sie der Join-Tabelle nicht einfach eine eigene (sinnlose) ID, machen Sie die Hardware-/Eingabe-IDs zu Fremdschlüsseln und nennen Sie sie einen Tag? Beachten Sie, dass das Attribut 'Key' nur für Felder erforderlich ist, die zum Identifizieren von Datensätzen in dieser Tabelle verwendet werden (der Primärschlüssel für die Tabelle). Wenn Sie es für mehrere Felder verwenden, wird ein zusammengesetzter Schlüssel erstellt. – Basic

+0

Das ist völlig richtig - ich weiß nicht, warum ich das nicht bemerkt habe ... Wenn du das in eine Antwort schreibst, werde ich es als gelöst setzen ... Danke! – C4p741nZ

Antwort

1

[aus einem Kommentar Promoted]

Stopp und einen Schritt zurück .... Was versuchen Sie erreichen?

Warum geben Sie der Join-Tabelle nicht nur eine eigene (bedeutungslose) ID, machen Sie die Hardware/Eingabe-IDs Fremdschlüssel und rufen Sie sie an?

Beachten Sie, dass das Schlüsselattribut nur für Felder erforderlich ist, die zum Identifizieren von Datensätzen in dieser bestimmten Tabelle verwendet werden (der Primärschlüssel für die Tabelle). Wenn Sie das Attribut für mehrere Felder verwenden, wird ein zusammengesetzter Schlüssel erstellt (und von hier kommt Ihre eindeutige Einschränkung).