3
public class A  
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public virtual int Aid { get; set; }  

    public virtual ICollection<B> B { get; set; }  
} 


public class B 
{  
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]  
    public virtual int Bid { get; set; } 

    [Key] 
    [Column(Order = 0)] 
    [Required]   
    Public virtual string BName {get ; set} 

    [Key] 
    [Column(Order = 1)] 
    [Required]  
    public virtual int Aid { get; set; } 

    [ForeignKey("Aid")] 
    public virtual A A { get; set; } 

    public virtual ICollection<C> C { get; set; }  
} 


public class C 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]  
    public virtual int Cid { get; set; } 

    [Key] 
    [Column(Order = 0)] 
    [Required]  
    Public virtual string CName {get ; set}  

    [Key] 
    [Column(Order = 1)] 
    [Required]   
    public virtual int Bid { get; set; } 

    [ForeignKey("Bid")] 
    public virtual B B { get; set; } 
} 

関係は、私は、クラスCマッピングEFコード内の非主要代理キー列に外部キー最初

エラーで外部キーとしてBNAMEを含めるいけない.I悩まれています関係性の制約で従属し、主な役割のプロパティ の私はAとの間の関係を乱すことなく、それを達成することができますどのように、私はエラーを理解するが、私は唯一の入札によってCクラスを指すようにしたい

同一である必要がありますそして限り、私はそれを理解B.

答えて

2

属性または流暢APIのいずれかで最初のEFコードでそれを行うにはことはできません。

しかし、私はあなたのソリューションを少し改造することを提案することができます - 主キーを作成しないでくださいB(BName, Aid) - ユニークなインデックスにする - Unique Key constraints for multiple columns in Entity Framework

public class B 
{  
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]  
    public virtual int Bid { get; set; } 

    [Index("IX_B_Name_Aid", 1, IsUnique = true)] 
    [Required]   
    Public virtual string BName {get ; set} 

    [Index("IX_B_Name_Aid", 2, IsUnique = true)] 
    [Required]  
    public virtual int Aid { get; set; } 

    [ForeignKey("Aid")] 
    public virtual A A { get; set; } 

    public virtual ICollection<C> C { get; set; }  
} 


public class C 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]  
    public virtual int Cid { get; set; } 

    [Key] 
    [Column(Order = 0)] 
    [Required]  
    Public virtual string CName {get ; set}  

    [Key] 
    [Column(Order = 1)] 
    [Required]   
    public virtual int Bid { get; set; } 

    [ForeignKey("Bid")] 
    public virtual B B { get; set; } 
} 

指数は、(追加のオーバーヘッドのビットを持つもののBidカラムを主surrogateインデックスをサポートするために)あなたの主キーとして照会するために同じパフォーマンス上の利点が得られます。

また、お読みにはSurrogate vs. natural/business keysをお勧めします。

関連する問題