Tip: Sqlite, Entity Framework e c#

Da qualche giorno mi sono messo a scrivere righe di codice su righe di codice per la creazione di un piccolo applicativo per la fatturazione.

Scritto in C# utilizza dati memorizzati su di un DB Sqlite, e li gestisce tramite l’entity framework di .Net.

Dalle premesse sembra una cosa figa e veloce, ed è anche così, se non fosse per il fatto che mi sono inchiodato su una vera e propria “boiata” come si dice dalle mie parti.

La cosa che mi faceva imbestialire era che alcune relazioni di chiavi esterna venivano riconosciute ed altre no. Questo comportava il fatto che nella generazione del modello dallo schema del database, l’entity framework non riconoscesse le relazioni e di conseguenza nelle classi generate mancavano alcuni campi, come per esempio il riferimento all’oggetto collegato alla chiave esterna.

Ma come mai alcune relazioni si altre no?
Ho provato a controllare i parametri di generazione, ma non erano quelli.
Ho provato a controllare ogni possibile errore nella grammatica del DDL, ma nulla nemmeno quelli. Anche perchè lo schema del DB veniva generato, e quindi non ci potevano essere tali errori.
Se la sintassi era esatta, se lo schema, i tipi e quant’altro erano corretti… cosa c’era di sbagliato?

Tanto per fare un esempio pratico: ho una tabella Prodotti ed una tabella Categorie. Alla fine della definizione della tabella Prodotti mi ritrovo con questa riga

FOREIGN KEY (fk_categoria) REFERENCES categorie(id) ON DELETE no action

e la tabella categorie così strutturata:

CREATE TABLE IF NOT EXISTS Categorie(
id INTEGER NOT NULL PRIMARY KEY autoincrement,
descrizione VARCHAR(100) NOT NULL
) ;

e tale relazione non è riconosciuta durante la generazione del modello.

Mentre questa, per la tabella ProdottiPrezzi verso la tabella Prodotti ma non verso la tabella Prezzi

CREATE TABLE IF NOT EXISTS ProdottiPrezzi(
id INTEGER NOT NULL PRIMARY KEY autoincrement,
fk_prodotto INTEGER NOT NULL,
fk_prezzo INTEGER NOT NULL,
dateLastUse datetime NOT NULL DEFAULT 'now',
 
FOREIGN KEY (fk_prodotto) REFERENCES Prodotti(id) ON DELETE no action,
FOREIGN KEY (fk_prezzo) REFERENCES prezzi(id) ON DELETE no action
);

viene riconosciuta e generata dall’entity framework.

Cosa c’è di diverso tra le due?
Ho provato anche con la generazione della relazione in-line, cioè con una sintassi tipo

fk_prodotto INTEGER NOT NULL REFERENCES prodotti(id) ON DELETE no action,

ma anche in questo caso nulla da fare. La relazione non viene riconosciuta.

Alla fine, tanto per scrupolo, ho provato a riportare i nomi in modo ESATTO, prestando attenzione a minuscole e maiuscole. E come per magia ecco apparire tutte le relazioni di chiave esterna!
A quanto pare durante la generazione dello schema a sqlite non importa che i nomi abbiano la stessa struttura case-sensitive, mentre l’entity framework, in fase di generazione del modello, richiede che i nomi siano riportati in modo esatto per riconoscere le relazioni di chiave esterna e quindi generare correttamente il nostro modello.

Quindi ricordate: con l’entity framework fate attenzione al CASE dei nomi delle vostre tabelle. Non si mai che vi risparmiate ore di smadonnamenti!

Lascia un commento

We use cookies to ensure that we give you the best experience on our website.
Ok