Nel precedente articolo abbiamo visto come creare e gestire un database SQL Server utilizzando un progetto in Visual Studio.
In questo articolo vedremo come creare le classi in Entity Framework Core (EF Core) per la gestione dei dati del database.
Per prima cosa aggiungiamo un nuovo progetto alla soluzione utilizzata precedentemente, il progetto è di tipo “Class Library” e come framework utilizziamo “.NET 6.0”.
Eliminiamo il file “Class1.cs” in quanto non lo utilizziamo.
A questo punto la soluzione dovrebbe presentarsi in questo modo:

Modifichiamo il file del progetto .csproj togliendo la linea evidenziata in rosso.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>
Vediamo cosa accede se non togliamo <Nullable>enable</Nullable>.
Prendiamo come esempio la seguente classe che contiene una solo proprietà.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Entities {
public class Class1 {
public string prop { get; set; }
}
}
Nonostante il codice sia corretto, quando andiamo a compilare riceviamo il seguente warning:
warning CS8618: Non-nullable property ‘prop’ must contain a non-null value when exiting constructor. Consider declaring the property as nullable.
Se al contrario togliamo <Nullable>enable</Nullable> dal .csprog, il compilatore non ci segnala nessun warning.
Utilizzo di EF Core Power Tools
Per implementare le classi per la gestione del DB utilizziamo uno strumento che permette la generazione del codice dalla struttura del database (reverse engineer).
In Visual Studio aggiungere l’estensione “EF Core Power Tools” (https://marketplace.visualstudio.com/items?itemName=ErikEJ.EFCorePowerTools)

Dal menu di “EF Core Power Tools” scegliamo l’opzione “Reverse engineer”.

Selezioniamo il database e le tabelle che vogliamo gestire.


Come ultimo passaggio mettiamo impostiamo le proprietà per la generazione del codice nel seguente modo:

Al termine del processo lo strumento avrà generato le classi necessarie per la gestione del database.

Se in compilazione vengono visualizzati i seguenti errori, è necessario installare i package di EF Core. Dal menu selezionare “Menage Nuget Packages…” e installare:
Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.Proxies

// <auto-generated> This file has been auto generated by EF Core Power Tools. </auto-generated>
#nullable disable
using System;
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata;
namespace Entities
{
public partial class DataContext : DbContext
{
public DataContext()
{
}
public DataContext(DbContextOptions<DataContext> options)
: base(options)
{
}
public virtual DbSet<Anagrafica> Anagrafica { get; set; }
public virtual DbSet<Contatti> Contatti { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Anagrafica>(entity =>
{
entity.Property(e => e.Id).ValueGeneratedNever();
});
modelBuilder.Entity<Contatti>(entity =>
{
entity.Property(e => e.Id).ValueGeneratedNever();
entity.HasOne(d => d.IdAnagraficaNavigation)
.WithMany(p => p.Contatti)
.HasForeignKey(d => d.IdAnagrafica)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("FK_Contatti_Anagrafica");
});
OnModelCreatingPartial(modelBuilder);
}
partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
}
}
// <auto-generated> This file has been auto generated by EF Core Power Tools. </auto-generated>
#nullable disable
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
namespace Entities
{
public partial class Anagrafica
{
public Anagrafica()
{
Contatti = new HashSet<Contatti>();
}
[Key]
public int Id { get; set; }
[StringLength(128)]
[Unicode(false)]
public string Denominazione { get; set; }
[StringLength(64)]
[Unicode(false)]
public string Nome { get; set; }
[StringLength(64)]
[Unicode(false)]
public string Cognome { get; set; }
[InverseProperty("IdAnagraficaNavigation")]
public virtual ICollection<Contatti> Contatti { get; set; }
}
}
// <auto-generated> This file has been auto generated by EF Core Power Tools. </auto-generated>
#nullable disable
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
namespace Entities
{
public partial class Contatti
{
[Key]
public int Id { get; set; }
public int IdAnagrafica { get; set; }
[Required]
[StringLength(50)]
[Unicode(false)]
public string Tipo { get; set; }
[Required]
[StringLength(256)]
[Unicode(false)]
public string Contatto { get; set; }
[ForeignKey("IdAnagrafica")]
[InverseProperty("Contatti")]
public virtual Anagrafica IdAnagraficaNavigation { get; set; }
}
}
Nel prossimo articolo vedremo come utilizzare la “Class Library” per la creazione di API.
Average Rating