Fluent Api di Entity Framework Core – continuando a sbirciare

Introduzione

In un articolo precedente ho descritto una parte delle funzionalità offerte dalla Fluent Api di Entity Framework Core; in questo post darò un’altra sbirciata a questa Api.

RelationShip One-To-One

Entity Framework Core per default gestisce le proprietà di navigazione come relazioni uno a molti (One-To-Many). A volte può capitare di trovarsi nella necessità di implementare una relazione uno a uno (One-To-One); in questo caso dobbiamo definirla esplicitamente.

Nella classe del modello oltre ad indicare l’entità in relazione attraverso la Navigation Property, devo indicare anche il campo che verrà utilizzato come chiave esterna.

Model definito con una relation one-to-one

Nel metodo OnModelCreating viene definita l’associazione tra le entità del model che è stato definito.

Definizione relation one-to-one sul ModelCreating

Relation Ship Many-To-Many

Entity Framework Core non supporta ancora la gestione delle relazioni molti a molti (Many-To-Many), quindi per implementare questa casistica abbiamo la necessità di utilizzare una classe di cross fra le entità coinvolte.

RelationShip Many-to-Many

In questo modo la relazione molti a molti (Many-to-Many) è stata ricondotta a due relazioni uno a molti (One-to-Many).

In questo caso è possibile lasciare che Entity Framework Core faccia il lavoro per noi, definendo lo schema del database, partendo dal modello che è stato creato, oppure specificando le regole per la creazione dello schema del database nel metodo OnModelCreating.

Owned Type

Durante la definizione di un Model può capitare di definire una property come tipo complesso.

Class Author e Class Address

In questo caso è stata creata una classe “Author” che fa riferimento alla classe “Address”.
Sul database ho la necessità di rappresentare la classe “Author” utilizzando un’unica tabella. Per risolvere questa casistica, Entity Framework Core consente di definire gli Owned Type nel metodo OnModelCreating, utilizzando il metodo OwnsOne sull’entità di riferimento, in questo caso la classe “Author”.

Definizione di un OwnedType

Le corrispodenti colonne associate alle property della classe che abbiamo definito come Owned Type, verranno definite utilizzando la convenzione: <NomeClasse>_<NomeProperty>. In questo esempio avremo:

  • Address_Location
  • Address_City
  • Address_State
  • Address_ZipCode

Chiave primaria

In Entity Framework Core esiste la convenzione per la quale un campo chiamato Id, oppure <NomeEntity>Id, viene definita come chiave primaria.

Nel caso in cui la chiave primaria che viene definita sull’entità abbia un nome differente rispetto alla convenzione, bisogna specificarlo nel metodo OnModelCreating utilizzando il metodo HasKey.

Definizione chiave primaria

Chiave primaria composta

Il metodo HasKey viene utilizzato anche nel caso in cui si ha la necessità di definire su di un’entità una chiave primaria composta. Questa situazione si verifica spesso sulle entità di cross utilizzate per la definizione delle relazioni molti a molti (Many-to-many).

Entità di cross

Per la classe “BookAuthor” voglio definire una chiave primaria composta. Le property coinvolte saranno (BookId e AuthorId) utilizzando il metodo HasKey.

Definizione chiave primaria composta

La chiave primaria per l’entità “BookAuthor” è costituita da due property (BookId, AuthorId), che per convenzione verranno definite come Identity. Per questo motivo bisogna utilizzare il metodo ValueGeneratedNever su entrambe le property, in modo che il suo valore non venga generato in automatico da SQL Server.