0

この質問は、私の前の質問の一般化です。

Entity Framework で PostGreSQL を使用する場合の LINQ のエラー
2 つのテーブル間に複数のリレーション (私の例では 7) が存在する場合、EF は追加の列を追加してこのテーブルを正規化しようとするという仮説があります。

たとえば、モデル a:

public partial class a
{        
    [Key]
    public int id { get; set; }

    [ForeignKey("contractors"), Column(Order = 0)]
    public Nullable<int> ot_contractor_id { get; set; }

    [ForeignKey("contractors1"), Column(Order = 1)]
    public Nullable<int> gvo_contractor_id { get; set; }

    public virtual contractors contractors { get; set; }
    public virtual contractors contractors1 { get; set; }    
}

テーブル [a] はテーブル [contractors].[id] とリレーションを持っているため、EF は列の "contractors_id" と "contractors1_id" を生成します。

他のテーブルにはリレーションが 1 つしかなく、正常に機能します。

質問: その仮説は正しいですか?! そして、過剰な列の問題は、いくつかの関係を持つ異常なテーブルから来ていますか? ありがとう!

4

1 に答える 1

2

contractors次のように、クラスに逆ナビゲーション プロパティがある場合に発生する可能性があります。

public partial class contractors
{
    //...

    public virtual ICollection<a> aCollection { get; set; }
    public virtual ICollection<a> aCollection1 { get; set; }
}

この場合、EF は、どれがクラスのどのナビゲーション プロパティに属しているかを認識せaず、2 つではなく 4 つのリレーションシップ (コレクションが 1 つしかない場合は 2 つではなく 3 つ) を想定します。これらの追加の関係には別の外部キーがあり、そのうちの 1 つがcontractors_id. それがデータベースに存在しない場合は、例外が発生します。

InversePropertyclass に属性を適用することで問題を解決できますa

[InverseProperty("aCollection")]
public virtual contractors contractors { get; set; }
[InverseProperty("aCollection1")]
public virtual contractors contractors1 { get; set; }
于 2013-07-19T16:26:11.150 に答える