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

Beziehung zwischen B und C ist beunruhigend mich .Ich möchte nicht bname als Fremdschlüssel in der Klasse CMapping Fremdschlüssel nicht primäre Ersatzschlüssel Spalte in EF Code zuerst

Fehler enthalten: Die Zahl von Eigenschaften in den abhängigen und Hauptrollen in einer Beziehung Einschränkung muss

ich verstehe den Fehler, aber ich mag darauf hinweisen, um C-Klasse nur von Bid identisch sein, wie ich es ohne Störung die Beziehung zwischen A erreichen kann und B.

Antwort

2

Soweit ich verstehen, ist es nicht möglich es in EF-Code zu tun, zuerst mit entweder Attribute oder fließend api:

Aber ich kann vorschlagen, dass Sie Ihre Lösung ein wenig umgestalten - erstellen Sie keinen Primärschlüssel auf B(BName, Aid) - machen Sie es zu einem eindeutigen Index - Unique Key constraints for multiple columns in Entity Framework. (Wenn auch mit ein wenig zusätzlichen Aufwand den primären surrogate Index über die Bid Säule unterstützen)

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

Der Index erhalten Sie die gleichen Leistungsvorteile geben für als Primärschlüssel abfragt.

Auch empfohlen, zu lesen - Surrogate vs. natural/business keys.

Verwandte Themen