2016-12-06 4 views
0

私は「UnitInfo」のセットが割り当てられているために、複数の「単位」を取得しようとしていますが、最初のコードを使用したとき、私はEFから、次のメッセージが表示されます:複数の同じテーブルEntity Frameworkのコードに0..1の関係最初

モデル生成中に1つ以上の検証エラーが検出されました: Unit_UnitInfo_Source :: Multiplicityは、 'Unit_UnitInfo'という関係の 'Unit_UnitInfo_Source'ロールでは無効です。依存ロールのプロパティはキープロパティではないため、依存ロールの多重度の上限は ''でなければなりません。 SubUnit_UnitInfo_Source :: Multiplicityは、 'SubUnit_UnitInfo'という関係の 'SubUnit_UnitInfo_Source'ロールでは無効です。依存ロールのプロパティはキープロパティではないため、依存ロールの多重度の上限は ''でなければなりません。

私が使用するクラスは、次のようになります。

public class Unit 
{ 
    public int UnitId { get; set; } 
    public string Name { get; set; } 
    public List<SubUnit> SubUnits { get; set; } 

    [ForeignKey("UnitInfoId")] 
    public UnitInfo UnitInfo { get; set; } 
} 

public class SubUnit 
{ 
    public int SubUnitId { get; set; } 
    public string Name { get; set; } 

    [ForeignKey("UnitInfoId")] 
    public UnitInfo UnitInfo { get; set; } 
} 

public class UnitInfo 
{ 
    public int UnitInfoId { get; set; } 
    public string Function { get; set; } 
    public string Location { get; set; } 
} 

イムそれは単純なミスであることを確認し、私はちょうどそれを把握するカント。

私は間違っていますか?

+0

あなたの問題を解決するのに役立ちましたら、私の解決策を回答として記入してもらえますか、それとも何かお気軽に質問してください。 –

答えて

0

[ForeignKey()]属性は、外部キーまたは同じクラスのナビゲーションプロパティを参照する必要があります。したがって、UnitInfoIdは、ナビゲーションプロパティと[ForeignKey()]属性を指定するクラスのメンバーである必要があります。

EFで遅延ロード用のプロキシクラスを作成できるようにするには、ナビゲーションプロパティを仮想にする必要があります。流暢なAPIを使用しない場合は、主キーに[Key]属性を指定する必要があります。さらに、参照コレクションは仮想ICollectionメンバとして宣言する必要があります。

public class Unit 
{ 
    public Unit() 
    { 
     SubUnits = new HashSet<SubUnit>(); 
    } 

    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int UnitId { get; set; } 
    public string Name { get; set; } 

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public virtual ICollection<SubUnit> SubUnits { get; set; } 

    public int UnitInfoId { get; set; } 

    [ForeignKey("UnitInfoId")] 
    public virtual UnitInfo UnitInfo { get; set; } 
} 

public class SubUnit 
{ 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int SubUnitId { get; set; } 
    public int UnitId { get; set; } 
    public string Name { get; set; } 

    [ForeignKey("UnitId")] 
    public virtual Unit ParentUnit { get; set; } 

    public int UnitInfoId { get; set; } 
    [ForeignKey("UnitInfoId")] 
    public UnitInfo UnitInfo { get; set; } 
} 

public class UnitInfo 
{ 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int UnitInfoId { get; set; } 
    public string Function { get; set; } 
    public string Location { get; set; } 
} 

しかし、UnitとSubUnitは同じ構造を共有しているため、継承を使用することをお勧めします。 EFコードの詳細については、最初にお読みくださいHERE

関連する問題