Domanda

Questo è un follow-up a un precedente domanda ho postato sui tasti di entità EF4 con SQL Compact . SQL Compact non consente le chiavi di identità generate dal server, quindi sono lasciato con la creazione mie chiavi come oggetti vengono aggiunti al ObjectContext. La mia prima scelta sarebbe una chiave intera, e la risposta precedente collegato a un dopo blog che mostra un metodo di estensione che utilizza l'operatore Max con un'espressione di selezione per trovare la prossima chiave disponibile:

public static TResult NextId<TSource, TResult>(this ObjectSet<TSource> table,  Expression<Func<TSource, TResult>> selector) 
    where TSource : class
{
    TResult lastId = table.Any() ? table.Max(selector) : default(TResult);

    if (lastId is int)
    {
        lastId = (TResult)(object)(((int)(object)lastId) + 1);
    }

    return lastId;
}

Ecco il mio prendere sul metodo di estensione: E funziona bene se il ObjectContext che sto lavorando con ha un set di entità non filtrato. In tal caso, il ObjectContext conterrà tutte le righe della tabella di dati, e io otterrà un risultato preciso. Ma se il set di entità è il risultato di un filtro di query, il metodo restituirà l'ultima chiave di entità nel set di entità filtrato, che non sarà necessariamente l'ultima chiave nella tabella dati. Quindi penso che il metodo di estensione non funzionano veramente.

A questo punto, la soluzione più ovvia sembra essere di usare semplicemente un GUID come chiave di entità. In questo modo, ho solo bisogno di chiamare il metodo Guid.NewGuid() per impostare la proprietà ID prima che io aggiungo una nuova entità alla mia ObjectContext.

C'è un modo semplice di ottenere l'ultima chiave primaria nell'archivio dati da EF4 (senza dover creare un secondo ObjectContext a tal fine):

Ecco la mia domanda? Ogni altro motivo per non prendere la via più facile e semplice utilizzare un GUID? Grazie per il vostro aiuto.

È stato utile?

Soluzione

ho finito per andare con un GUID.

  • I problemi di dimensioni / prestazioni non sono critica (o anche evidente) con SQL Compact, dal momento che esso è un sistema a singolo utente locale. Non è come l'applicazione sarà la gestione di un prenotazione aerea sistema.

  • E almeno a questo punto, non ci sembra essere alcun modo per aggirare il "no chiavi generate dal server" limitazione della lo stack SQL Compact / EF4. Se qualcuno ha un trucco geniale, io sono ancora aperti ad esso.

Questo non significa che avrei preso lo stesso approccio in SQL Server o SQL Express. Ho ancora un preferenza per chiavi intere, e fratelli più grandi di SQL Compact li permetto in collaborazione con EF4.

Altri suggerimenti

Usa un Guid. AutoIncrement non è supportato su Compact Framework con Entity Framework.

Inoltre, se vi capitasse di voler creare un'applicazione che utilizza più fonti di dati, int PK di stanno andando a cadere a pezzi su di voi molto, molto rapidamente.

  • Con Guid di, è possibile chiamare juse Guid.NewGuid () per ottenere una nuova chiave.
  • Con Int di, si deve colpire il database per ottenere una chiave valida.

Se si memorizzano i dati in più database, int PK la volontà di causare conflitti.

Quello che ho fatto per SQL CE, prima, e presumo che abbiamo un'unica applicazione l'accesso al database, è quello di calcolare il valore MAX all'avvio e metterlo in una variabile statica. È ora possibile distribuire valori sequenziali in modo semplice e si può fare il codice per generare loro thread-safe molto facilmente.

Una ragione per evitare GUID sarebbe size = memoria e consumo di spazio di memorizzazione.

Si potrebbe anche interrogare i metadati di SQL Compact in questo modo:

Seleziona AUTOINC_NEXT DA INFORMATION_SCHEMA.COLUMNS DOVE table_name = 'Categorie' E AUTOINC_NEXT IS NOT NULL

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top