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

relation entre B et C me troublant .Je ne veux pas inclure bname comme clé étrangère dans la classe CCartographie clé étrangère à la colonne clé de substitution non primaire dans le code EF premier

Erreur: Le nombre des propriétés dans les rôles dépendants et principaux dans une contrainte de relation doit être identique

Je comprends l'erreur mais je veux signaler à la classe C que par l'offre, comment je peux y parvenir sans perturber la relation entre a et B.

Répondre

2

Pour autant que je comprends, il est pas possible de le faire dans le code EF d'abord avec deux attributs ou api couramment:

Mais je peux vous proposer de remodeler votre solution un peu - ne créez pas de clé primaire sur B(BName, Aid) - en faire un index unique - 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; } 
} 

L'indice vous donnera les mêmes performances pour effectuer des requêtes comme la clé primaire (mais avec un peu de frais généraux supplémentaires pour soutenir l'indice surrogate primaire sur la colonne Bid).

En outre, lecture recommandée - Surrogate vs. natural/business keys.