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.


Definisco una classe “Person” sulla quale andro` a creare delle “shadows properties”:

public class Person
{
public int PersonId { get; set; }
public String Code { get; set; }
public String FirstName { get; set; }
public String LastName { get; set; }
public DateTime BirthDate { get; set; }
}

La classe “Person” dovra` interagire con la tabella “Person”:

CREATE TABLE Person
PersonId Int NOT NULL Identity(1, 1)
Code NVarchar(50) NOT NULL,
FirstName NVarchar(255) NOT NULL,
LastName NVarchar(255) NOT NULL,
BirthDate Datetime NOT NULL,
CreateDate Datetime NOT NULL,
IsActive Bit NOT NULL,
CONSTRAINT [PK_Categories] PRIMARY KEY CLUSTERED
(
[CategoryID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

Le colonne CreateDate e IsActive sono le shadows properties che ho definito, in quanto sono presenti solo sulla tabella.

Shadow property – utilizzo

La definizione di una shadow property avviene all’interno del metodo “OnModelCreating” del DbContext che ho definito. La sintassi è
simile alla definizione di una qualunque property; dove il nome della property viene passato come argomento di tipo “String” al metodo “Property”, mentre il tipo viene passato come “parametro di tipo” al metodo Property.

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Person>(b =>{
b.Property<int>(p => p.PersonId).IsRequired(true);
b.Property<string>(p => p.Code).IsRequired(true);
b.Property<string>(p => p.FirstName).IsRequired(true);
b.Property<string>(p => p.LastName).IsRequired(true);
b.Property<DateTime>(p => p.BirthDate).IsRequired(true);
b.Property<DateTime>("CreateDate");,
b.Property<Boolean>("IsActive");,
});
}

Per una shadow property non è possibile utilizzare la notazione con le “lambda-expression”, in quanto non è una property della classe.

Il suo utilizzo è simile all’approccio utilizzando per la definizione del modello nel metodo “OnModelCreating”

Aggiungere un nuovo elemento:

myDbContext.Persons.Add(_person);
myDbContext.Entity(_person).Property("CreateDate").CurrentValue = DateTime.Now;,
myDbContext.Entity(_person).Property("IsActive").CurrentValue = true;,
myDbContext.SaveChanges();

Modifica di un elemento esistente:

myDbContext.Persons.Attach(_person);
myDbContext.Entity(_person).Property("CreateDate").CurrentValue = DateTime.Now;,
myDbContext.Entity(_person).Property("IsActive").CurrentValue = true;,
myDbContext.SaveChanges();

Selezione di elementi:

myDbContext.People.Where(item =>item.Code.StartsWith("000"));
myDbContext.People.Where(item => EF.Property(item, "IsActive").Equals(true));,

Ordinamento di elementi:

myDbContext.People.OrderBy(item => item.Code);
myDbContext.People.OrderBy(item => EF.Property(item, "CreateDate"));,

Shadow property – opinioni

Le shadows properties possono essere utilizzate, quando abbiamo dei campi che vogliamo gestire solo sulla base dati.

Es. un flag per gestire la cancellazione logica.

Es. un timestamp che tiene traccia dell’ultima modifica eseguita.

Se state utilizzando da poco .NET Core potreste avere delle difficoltà a far compilare il codice mostrato negli esempi.
Per risolvere questo problema dovete installare i pacchetti nuget indicati:

  • Microsoft.EntityFrameworkCore
  • Microsoft.EntityFrameworkCore.SqlServer
  • System.Linq

Leave a Reply

Your email address will not be published. Required fields are marked *