atrybut Klucz obcy służy do:
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; }
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.
dzięki @Evk za usunięcie wątpliwości. – IAmDineshL
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'. –