Utilizzando SQL di tipo uniqueidentifier tipo di colonna con Entity framework

Per la mia chiave primaria identità e i nostri Clienti la tabella io uso uniqueidentifier colonna con un valore di default impostato a newsequentialid(). L’inserimento di nuove righe attraverso lo strumento di gestione crea i valori per l’ID di multa.

Inserimento da .Rete 4 codice via EF risultati zero Guid (00000-0000….) di essere inserito. Ho creato l’entità nuova, impostare alcuni valori e di eseguire EF AddToClients (per esempio). Se il debug, il valore per la proprietà id mostra GUID zero. Io non esplicitamente impostare l’id tramite il Guid.NewGuid() nel mio codice, perché voglio lasciare fuori per il newsequentialid() in SQL Server. Il problema è che non funziona. La prima volta che viene eseguito il codice riga viene inserita con zero GUID. La prossima volta che, ovviamente, non riesce e si traduce in violazione di chiave primaria eccezione.

Come posso ottenere questo lavoro, senza dover impostare il GUID nel mio codice cliente?

InformationsquelleAutor mare | 2010-08-19

 

3 Replies
  1. 12

    È necessario modificare il StoreGeneratedPattern valore per la proprietà in EF designer. Impostare Identity. Questo causerà EF evitare di impostare il valore di un inserto, quindi acquisita dopo l’inserimento è completa.

    Si noti che se si utilizza EF 4, si possono avere problemi con questo utilizzando la finestra di progettazione (vedi questo link). Potrebbe essere necessario modificare l’ .edmx manualmente e impostare il StoreGeneratedPattern di stoccaggio del modello stesso.

    • Fatto. Nessun cambiamento. L’entità ha ancora ZERO GUID impostato prima dell’inserimento e dell’inserimento e non riesce con la chiave duplicata (ho lasciato precedentemente inserito in tabella).
    • ohh vedo su problemi di progettazione…questo è semplicemente fantastico..SULLA cima di un altro problema che ho scritto in un’altra domanda, ora questo. Grazie per la risposta però.
    • Sento il tuo dolore. EF è uno strumento potente, ma quando si incontra qualcosa che non gestire ben, può essere un enorme mal di testa per ottenere intorno ad esso.
    • enorme è sicuramente la parola giusta, perché questo è un grande dolore …, proprio la lettura di questo geeksharp.com/2010/05/27/ef4-bug-in-storegeneratedpattern-ssdl
    • Molte Grazie per la tua risposta. Stavo affrontando lo stesso problema e ha risolto con il tempo.
    • ogni volta che aggiorno la proprietà della mia colonna StoreGeneratedPattern=”Identity”, e quindi eseguire il programma e fare dbContext.SaveChanges(), ottengo il seguente errore: =====> store update, insert o delete interessato a un inaspettato numero di righe (0). entità potrebbe essere stato modificato o cancellato dall’entità sono stati caricati. aggiorna objectstatemanager voci.

  2. 0

    Mi sono imbattuto in questo problema stesso. Si tratta di un vero e proprio dolore. Ecco una pagina su di esso, w/commenti da parte di Microsoft – http://social.msdn.microsoft.com/Forums/en/adonetefx/thread/aecf14e3-e4c9-439b-88af-23d4353afb9d.

    La mia soluzione era quella di creare una stored procedure da utilizzare per l’INSERIMENTO. Questa pagina ha qualche info su come farlo – http://thedatafarm.com/LearnEntityFramework/tutorials/using-stored-procedures-for-insert-update-amp-delete-in-an-entity-data-model/. Finora ho solo un inserto stored proc – nulla per aggiornare o cancellare; e contrario all’articolo, io non sto ricevendo un modello di errore di convalida.

    CORREZIONE EF mi permetta di ottenere, per quanto il recupero di un elenco di soggetti, ma quando sono andato per ottenere un’istanza di uno in particolare, ho avuto il problema la mancanza di una funzione di mappatura per gli aggiornamenti. Ugh!

    Per recuperare inserito UUID che è stato generato con newsequentialid(), ho usato il “OUTPUT INSERITO.[colonna]”, tecnica che è stata introdotta con SQL Server 2005. Un esempio è Recuperare l’ultima riga inserita Uniqueidentifier che non è IDENTITÀ. Ho usato la stessa tecnica, INSERISCI stored procedure per recuperare le colonne di tipo datetime che sono stati fissati con un default getdate().

    Spero che questo aiuta qualcuno,

    Donnie

    • per risolvere il problema ho usato il Guid.NewGuid() la funzione nel mio codice, quindi ho appena generare un GUID per la mia nuova entità prima di inserire. Non è sequenziale, ma funziona e continuerà a funzionare quando l’EF modifiche nelle versioni future. L’impatto sulle prestazioni dovrebbe essere basso tabelle con poche centinaia di dischi.
  3. 0

    Fare clic su di voi .edmx. Aprire con un editor di testo XML con codifica o altro.
    Trovare il nome di id e aggiungere l’attributo accanto nella stessa tag: StoreGeneratedPattern=”Identity”.

    Esempio:

    < Property Name=”WorkerId” Type=”uniqueidentifier” Nullable=”false” StoreGeneratedPattern=”Identity” />

Lascia un commento