2016-11-08 11 views
5

Wiedziałem, że właściwość odwrotna jest używana, gdy masz wiele relacji między klasami. ale jestem zdezorientowany między właściwością odwrotną a własnością klucza obcego, ponieważ obie są używane do definiowania relacji.jaka jest różnica między właściwością odwrotną a kluczem obcym w strukturze podmiotu?

public class PrivilegeToDbOperationTypeMap : BaseEntity 
{ 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity), Column(Order = 0)] 
    public int PrivilegeToDbOperationTypeMapId { get; set; } 

    [ForeignKey("privilegeLookup"), Column(Order = 1)] 
    [Index("IX_PrivilegeLookupId_DbOperationLookupId", 1, IsUnique = true)] 
    public int PrivilegeLookupId { get; set; } 

    [ForeignKey("dbOperationTypeLookup"), Column(Order = 2)] 
    [Index("IX_PrivilegeLookupId_DbOperationLookupId", 2, IsUnique = true)] 
    public int DbOperationLookupId { get; set; } 

    #region Navigation Properties 

    public PrivilegeLookup privilegeLookup { get; set; } 

    public DbOperationTypeLookup dbOperationTypeLookup { get; set; } 

    [InverseProperty("privilegeToDbOperationTypeMap")] 
    public ICollection<RoleToPrivilegeDbOperationTypeMap> roleToPrivilegeDbOperationTypeMaps { get; set; } 

    #endregion Navigation Properties 
} 

Odpowiedz

8

atrybut Klucz obcy służy do:

  1. wskazać nazwę właściwości nawigacji dotyczące danej nieruchomości klucza obcego

    // this is foreign key property with related "privilegeLookup" navigation property. Database column name will be PrivilegeLookupId 
    [ForeignKey("privilegeLookup"), Column(Order = 1)]  
    public int PrivilegeLookupId { get; set; } 
    // this is related navigation property 
    public PrivilegeLookup privilegeLookup { get; set; } 
    
  2. LUB podać nazwę właściwości klucza obcego dla podana właściwość nawigacji:

    // this is foreign key property 
    public int PrivilegeLookupId { get; set; } 
    // this is navigation property with related foreign key property 
    [ForeignKey("PrivilegeLookupId")] 
    public PrivilegeLookup privilegeLookup { get; set; } 
    

Jest to przydatne, gdy domyślne konwencje EF-Code-first nie mają zastosowania lub stosują się w sposób nieodpowiedni dla użytkownika. Here możesz zobaczyć listę konwencji EF-Code.

Inverse atrybut właściwość jest używana, gdy trzeba wskazać, że właściwość nawigacji w klasie związana jest z tym samym kluczem obcym jako inną nieruchomość nawigacji w klasie B. Na przykład:

public class Student 
{ 
    public int StudentID { get; set; } 

    public Standard CurrentStandard { get; set; } 
    public Standard PreviousStandard { get; set; } 
} 

public class Standard 
{  
    public int StandardId { get; set; } 

    public ICollection<Student> CurrentStudents { get; set; } 
    public ICollection<Student> PreviousStudents { get; set; } 
} 

Tutaj mamy dwie klasy, każda z dwiema właściwościami nawigacyjnymi. Naszym zamiarem jest posiadanie dwóch kluczy obcych w tabeli Student, prawdopodobnie o nazwach CurrentStandardId i PreviousStandardId, a właściwości nawigacji klasy Standard są również powiązane z tymi samymi kluczami obcymi (relacja jeden do wielu). Jednak w tym przypadku EF nie zda sobie z tego sprawy bez dalszych wskazówek - zamiast tego utworzy klucze obce . Aby poprowadzić go, musimy użyć odwrotnego atrybut właściwość:

public class Standard 
{ 
    public int StandardId { get; set; } 

    // reference to the name of another navigation property in class Student 
    [InverseProperty("CurrentStandard")] 
    public ICollection<Student> CurrentStudents { get; set; } 

    // reference to the name of another navigation property in class Student 
    [InverseProperty("PreviousStandard")] 
    public ICollection<Student> PreviousStudents { get; set; } 
} 

Teraz EF rozumie nasze intencje i stworzy tylko dwa klucze obce, choć nazwy nie będzie dobra. Aby zmienić również nazwy kolumn, możemy użyć atrybutu klucza obcego:

public class Student 
{ 
    public int StudentID { get; set; } 

    public int CurrentStandardId { get; set; } 
    public int PreviousStandardId { get; set; } 

    [ForeignKey("CurrentStandardId")] 
    public Standard CurrentStandard { get; set; } 

    [ForeignKey("PreviousStandardId")] 
    public Standard PreviousStandard { get; set; } 
} 

Krótka historia - EF może wydedukować wiele rzeczy na podstawie konwencji kodowych. Jednak gdy nie może (na przykład, gdy masz dwa klucze obce w tej samej klasie) - musisz pomóc, używając atrybutów z twojego pytania.

+0

dzięki @Evk za usunięcie wątpliwości. – IAmDineshL

+0

Aby go skompletować, właściwość 'public ICollection CurrentStudents' może również zostać opatrzona komentarzem przy użyciu' [ForeignKey ("CurrentStandardId")] '. Podejście to zwodniczo zbliża się do 'InverseProperty', ale może odnosić się tylko do właściwości pierwotnej, a nie do właściwości odniesienia, takiej jak' CurrentStandard'. –

Powiązane problemy