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.

Estendere Asp NET Core Identity

Introduzione

Asp Net Core Identity è il framework di Microsoft per la gestione dell’autenticazione di un’applicazione Asp.Net Core.

Moreno Gentili descrive molto dettagliatamente come personalizzare Asp.Net Core Identity. Seguendo le indicazioni presenti nell’articolo, creo una classe “ApplicationUserr” che estende “IdentityUser”.

Codice della classe ApplicationUser
ApplicationUser.cs
Continue reading Estendere Asp NET Core Identity

Le shadow properties di Entity Framework Core

Shadow property – definizione

Una shadow property è un campo definito in una tabella del database, ma che non ha una corrispondenza nella classe.Si può interagire con essa durante la creazione del modello e
per eseguire query.

Continue reading Le shadow properties di Entity Framework Core

Stored Procedure e EF

Entity Framework supporta le Stored Procedure attraverso le “Function Imports”, le quali creano dei metodi all’interno della classe “DbContext” per mezzo dei quali è possibile chiamare le varie Stored Procedure.
using (NorthwindEntities northWindContext = new NorthwindEntities())
{
List employeesList = northWindContext.spGetEmployees().ToList();
}
public virtual ObjectResult spGetEmployees()
{
return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("spGetEmployees");
}

Nel codice mostrato sopra c’è un esempio di una chiamata ad un metodo creato importando la Stored Procedure, e l’implementazione del metodo stesso.

Continue reading Stored Procedure e EF

Show on All Tabs

When it’s developping a windows form application the “TabControl” is one of controls more used by me.

If you need to show same control that has same data es. a panel in the all or several tabs, you can change the parent of control at runtime, specifyng the tab selected.

The event to manage it is “Selected” from TabControl, see the following code:


private void tcColor_Selected(object sender, TabControlEventArgs e)
{
pnlRed.Parent = e.TabPage;
pnlOrange.Parent = e.TabPage;
pnlYellow.Parent = e.TabPage;
pnlGreen.Parent = e.TabPage;
pnlAcqua.Parent = e.TabPage;
pnlBlue.Parent = e.TabPage;
}

Search Full DataBase

The searches in the database are very common, but sometimes it doesn’t know the table’s name or column’s name, but only the value to search.

I wrote a SQL Script that executes the search in the database, then in all columns.

The SQL Script can work on tables of sys namespace or on INFORMATION_SCHEMA namespace, in this situation they’re equivalent.

Continue reading Search Full DataBase

DateTime && TimeSpan

Lavorare con le date è uno dei compiti più ardui di noi sviluppatori; per fortuna c’è il “DateTime” di .NET che ci offre un valido aiuto.

Definiamo una lista di periodi avente i dati: (DataInizioPeriodo, DataFinePeriodo, InfoPeriodo), quindi definiamo una classe “Period”.
public class Period
{
public DateTime StartDate { get; set; }

public DateTime EndDate { get; set; }

public String Info { get; set; }
}

Continue reading DateTime && TimeSpan

Jira & Svn: semplice Project Management

Lavorando ad un progetto, una delle attività più complesse è rappresentata dalla capacità di tenere traccia delle funzionalità sviluppate:

  • Le specifiche del cliente.
  • Le risorse da cui è stata sviluppata.
  • I tempi di sviluppo.
  • I files e le strutture dati coinvolte.
  • Pre e post condizioni legate alla funzionalità realizzata.

Continue reading Jira & Svn: semplice Project Management

S.O.S. DataBase

I database sono file  e come tutti i files si possono corrompere o danneggiare, per fortuna esistono i backup e quindi basta eseguire un restore del database danneggiato.

Se non avete un backup recente a disposizione SQL Server mette a disposizione una procedura per ripristinare il database corrotto, di seguito il codice da eseguire per riparare il db.


EXEC sp_resetstatus [YourDatabase];
ALTER DATABASE [YourDatabase] SET EMERGENCY
DBCC checkdb([YourDatabase])
ALTER DATABASE [YourDatabase] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
DBCC CheckDB ([YourDatabase], REPAIR_ALLOW_DATA_LOSS)
ALTER DATABASE [YourDatabase] SET MULTI_USER

SQL Server 2016 & JSON

Microsoft con il rilascio di SQL Server 2016 ha introdotto il supporto nativo a JSON.

Di seguito vi segnalo una serie di articoli sul blog di SQL Server  che descrivono questa nuova funzionalità:

Oppure potete seguire questo video corso presente su Microsoft Virtual Accademy tenuto da Alessandro Alpi.