Esegue il trigger sulla chiave primaria anziché sull'identità

5

Ho il seguente problema -

Circa ~ 60 tabelle su SQL che alcuni hanno una chiave esterna l'una con l'altra, la chiave primaria come identità doveva cambiare con qualcos'altro con la logica. È stato sostituito da trigger che controllano qual è il numero successivo e modificano il campo della chiave primaria (in sequenza)

Ora questo fa molti problemi con EF quando provi ad inserire una nuova identità:

  1. Per aggiornare le chiavi esterne, devo recuperare l'entità dal DB perché la chiave primaria non si aggiorna.

  2. Quando aggiungo più di un'entità, l'EF genera un'eccezione sul fatto che la chiave primaria non è univoca. (Riceve il valore predefinito nel mio caso 0 per int)

La soluzione per 1 è valida solo se ho altri campi univoci che posso recuperare l'entità dal DB.

La migliore soluzione per 2 che potrei ricavare è usare l'entità di stacco dopo ogni inserto.

Entrambi non sono ottimali, per non dire altro.

Sarebbe lieto di sapere se esiste un'altra soluzione / un altro approccio invece dei trigger.

A questo punto non posso modificare la struttura delle tabelle sul database, solo le manipolazioni sul campo della chiave primaria.

Supplemento:

Gli ID generati automaticamente sono stati abbandonati per eliminare i duplicati in questo campo, poiché queste tabelle verranno eseguite su diversi db che vengono uniti di volta in volta.

    
posta Ziv Weissman 20.12.2016 - 15:49
fonte

1 risposta

2

Non penso che sia una soluzione perfetta, specialmente per le tabelle che stanno per crescere in modo imprevedibile, ma molti database (SQL Server), consentono i campi che applicano automaticamente un valore incrementale (Identity), in modo da essere seminato su un numero diverso da uno.

Il database A può iniziare con 1 e il database B potrebbe iniziare con 1 milione. Vi è garantita l'unicità tra i due database per le loro tabelle, ma ovviamente c'è un limite.

Esistono anche routine nel database per reimpostare i valori di identificazione esistenti. Questo probabilmente richiederebbe la risincronizzazione dei dati inviati da uno all'altro.

In questo modo, Entity Framework non dovrebbe essere interessato. Ottieni una parvenza di garanzia di unicità fino a un punto che richiederà un intervento simile a quello di DBA.

    
risposta data 21.12.2016 - 13:17
fonte

Leggi altre domande sui tag