2017-09-11 9 views
3

1つのプロパティを2つの別個のエンティティ(外部キーの一部として、外部キーとしての外部キー)として外部キーとして使用したいと考えています。ここで私が何を意味するかの簡単な例です:CodeFirst 2つのプロパティへの外部キー

public class ParentEntity{ 
    [Key, Column(Order = 1)] 
    String Id {get; set;} 
    [Key, Column(Order = 2), ForeignKey("Year")] 
    int YearId {get; set;} 

    [ForeignKey("YearId")] 
    Year Year; 
    virtual ICollection<ChildEntity> Children {get; set;} 
} 

public class ChildEntity{ 
    [Key, Column(Order = 0), ForeignKey("Parent")] 
    String Id {get; set;} 
    [Key, Column(Order = 1), ForeignKey("Parent")] 
    String ParentId {get; set;} 
    [Key, Column(Order = 2), ForeignKey("Parent, Year")] 
    int YearId {get; set;} 

    [ForeignKey("ParentId, YearId")] 
    ParentEntity Parent{get; set;} 

    [ForeignKey("YearId")] 
    Year Year {get; set;} 
} 

public class Year{ 
    [Key] 
    int YearId {get; set;} 
} 

ChildEntityでYearId /年のプロパティParentEntityに、主キー(ParentIdは/年)の一部、およびYearテーブルへの外部キーの両方として機能しなければなりません。

ただし、タグForeignKey("Parent, Year")は、ナビゲーションプロパティに対して1つのパラメータしか取ることができないため、無効です。それは「親」と「年」という名前の親、年」の代わりに、2つのナビゲーションプロパティという名前のナビゲーションプロパティ、探している、私は理にかなっていると仮定し

Additional information: The ForeignKeyAttribute on property 'YearId' on type 'CodeFirst.Models.ChildEntity' is not valid. 
The navigation property 'Parent, Year' was not found on the dependent type 'CodeFirst.Models.ChildEntity'. 
The Name value should be a valid navigation property name. 

:これは私が取得エラーメッセージです。

EntityFramework/CodeFirstにこのパターンを正しく認識させるにはどうすればよいですか?

NB:エンティティの「親」/「子」という名前を付けましたが、それらの間に継承関係はありません(実際は所有関係です)。

+0

だけで複合キーを使用しないでください。これは、あなたのコードを目的なしに不必要に複雑にする反パターンです。主キーの全体のポイントは、それがユニークであることです。他のものと組み合わせる必要はありません。 –

答えて

0

ナビゲーションプロパティまたはの外部キープロパティでForeignKeyAttributeのみが必要です。両方ではありません。したがって、このように:

public class ParentEntity 
    { 
     [Key, Column(Order = 1)] 
     public String Id { get; set; } 
     [Key, Column(Order = 2)] 
     public int YearId { get; set; } 

     [ForeignKey("YearId")] 
     Year Year; 
     public virtual ICollection<ChildEntity> Children { get; set; } 
    } 

    public class ChildEntity 
    { 
     [Key, Column(Order = 0)] 
     public String Id { get; set; } 
     [Key, Column(Order = 1)] 
     public String ParentId { get; set; } 
     [Key, Column(Order = 2)] 
     public int YearId { get; set; } 

     [ForeignKey("ParentId, YearId")] 
     public ParentEntity Parent { get; set; } 

     [ForeignKey("YearId")] 
     public Year Year { get; set; } 
    } 

    public class Year 
    { 
     [Key] 
     public int YearId { get; set; } 
    } 
0
public class ParentEntity{ 
    [Key, Column(Order = 1)] 
    String Id {get; set;} 
    [Column(Order = 2)] 
    int YearId {get; set;} 

    [ForeignKey("YearId")] 
    virtual Year Year; 
    virtual ICollection<ChildEntity> Children {get; set;} 
} 

public class ChildEntity{ 
    [Key, Column(Order = 0)] 
    String Id {get; set;} 
    String ParentId {get; set;} 
    int YearId {get; set;} 
    [ForeignKey("ParentId")] 
    virtual ParentEntity Parent{get; set;} 
    [ForeignKey("YearId")] 
    virtual Year Year {get; set;} 
} 

public class Year{ 
    [Key] 
    int YearId {get; set;} 
} 
関連する問題