Gli attributi <Key> e <ForeignKey> sono utilizzati da Entity Framework Code First per definire rispettivamente la (o le) chiave primaria e la chiave esterna qualora non sia (o non si voglia) seguire la “naming convention”.
L’attributo <Key> è intuitivo, serve per marcare una o più proprietà come chiave primaria nel database. Consideriamo le seguenti entità:
Public Class Book
<Key()>
Property BookId As Integer
Property Title As String
Property Author As Author
End Class
Public Class Author
Property AuthorId As Integer
Property FirstName As String
Property LastName As String
End Class
il risultato nel database è il seguente:

Tutto nella norma per quanto riguarda la chiave BookId mentre la chiave esterna rappresentata dalla proprietà Author è stata tradotta nel database con la coppia PropertyNavigationName_PropertyNameId che nell’esempio è Author_AuthorId. Si tratta di una convenzioni usata da Entity Framework laddove non viene specificato nulla dall’utente.
Ma se volessimo avere anche il valore della chiave esterna oltre all’intero oggetto rappresentato dalla navigation property Author, esattamente come avviene in Entity Framework 4? Usiamo l’attributo <ForeignKey> modificando la classe Book in questo modo:
Public Class Book
<Key()>
Property BookId As Integer
Property Title As String
<ForeignKey("AuthorId")>
Property Author As Author
Property AuthorId As Integer
End Class
Semplicemente si aggiunge una nuova proprietà che identifica il valore della chiave esterna (esattamente come lo definiremmo nel database) e decoriamo la navigation property Author con l’attributo <ForeignKey> specificando il nome della properietà/campo chiave di riferimento. Il database risultante sarà il seguente:

In questo modo possiamo sfruttare tutte le facilitazioni che già conosciamo in EF 4 e cioè usare il campo chiave anzichè la navigation property nelle operazioni di Add ed Update:
Dim _book As New Book With {
.Title = "Visual Basic 2010 Unleashed",
.AuthorId = 1
}