2016-10-21 9 views
2

この質問は私のOriginal Questionに関連しています。EFジャンクションテーブルにIdを追加して保存すると例外がスローされる

私はうまくいきましたが、数秒前に私はそれが私が期待したものではないことに気付きました。

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

このエントリに含めることができるアプローチのn 異なるハードウェアを使用していないが、ユニークなのId-セットになります二度同じハードウェアを追加します。

は、これを解決するために、私は私のEntryHardwareモデルに新しい独自のプロパティを追加しました:同上プロパティDBを介して自動的に設定され得ることはありません

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

残念ながら、このように。

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

しかし、それはDBへのエンティティを保存するために来るとき、この私のコードを使用して例外をthrowns:

ストア更新、挿入、私はこの問題を解決する必要がある属性を見つけた答えを探してまたは削除ステートメントは予期しない行数(0)に影響を与えました。エンティティはロードされた後に変更または削除された可能性があります。

が、問題はここにどこにあるのか私には....

+0

もう一度やり直してください....達成しようとしているのは何ですか? joinテーブルに独自の(無意味な)IDを与えるだけでなく、ハードウェア/エントリIDを外部キーにして、それを1日と呼ぶのはなぜですか? 'Key'属性は、そのテーブル(テーブルのプライマリキー)のレコードを識別するために使用されるフィールドでのみ必要であり、複数のフィールドでそれを使用すると複合キーが作成されることに注意してください。 – Basic

+0

これはまったく真実です - なぜ私はそれに気づいていないのか分かりません...あなたがこれを答えに入れれば解決されたように設定します...ありがとう! – C4p741nZ

答えて

1

を把握することはできません[コメントから昇格]

停止し、バックステップを取る....あなたは何をしようとしています達成するために?

なぜ、結合テーブルに独自の(無意味な)IDを与えるだけではなく、ハードウェア/エントリIDを外部キーにして、それを1日と呼びますか?

Key属性は、特定のテーブル(テーブルのプライマリキー)のレコードを識別するために使用されるフィールドにのみ必要であることに注意してください。複数のフィールドの属性を使用すると、コンポジットキーが作成されます(これがユニーク制約の元となります)。

関連する問題