Entity Framework: Usare una view senza PK (chiave primaria)

A volte può capitare di dover utilizzare entity framework (anche abbinato a POCO Generator) e trovarsi bloccati di fronte alla generazione via scaffolding di un controller con o senza views per una query generata in un database che risulta sprovvista per natura di chiavi primarie: È il caso per esempio di query di riepilogo con funzioni di aggregazione.
La soluzione è quella di aggiungere una colonna all’interno del periodo in cui viene effettuato un calcolo è generato un numero progressivo simile ad un indice tramite la funzione SQL ROW_NUMBER().
La sintassi e’ simile alla seguente:
SELECT …, ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS Id …
Questo comando però puo’ produrre una property nullable, non accettata/bile dallo scaffolder di Visual Studio.
[Column(@”Id”, Order = 1, TypeName = “bigint”)]
[Required]
[Key]
[Display(Name = “Id”, Order = 1)]
public long? Id { get; set; } // Id (Primary key)

Per ovviare a questo problema è sufficiente impostare una condizione is null All’interno dello script SQL:
SELECT …, ISNULL(ROW_NUMBER() OVER(ORDER BY (SELECT NULL)),-1) as Id …
Dove il valore -1 andrebbe a sostituire qualsiasi riga nulla (che banalmente non sarà mai presente poiché la funzione ROW_NUMBER() provvede a riempire tutte le righe)
Il risultato nel model sara’
[Column(@”Id”, Order = 1, TypeName = “bigint”)]
[Required]
[Key]
[Display(Name = “Id”, Order = 1)]
public long Id { get; set; } // Id (Primary key)

E quindi sarà possibile utilizzarlo all’interno dello scaffolder