Domanda

A torto oa ragione, sto usando identificatore univoco come chiave primaria per le tabelle nel mio database SQL Server. Ho generato un modello con LINQ to SQL (c #), ma dove nel caso di un LINQ colonna identity a SQL genera una chiave univoca su come inserire un nuovo record per guid / uniqueidentifier il valore predefinito di 00000000-0000-0000-0000-000000000000.

So che posso impostare il GUID nel mio codice: in LINQ to modello di SQL o altrove, o v'è il valore di default nella creazione della tabella di SQL Server (anche se questo viene sostituito dal valore generato nel codice). Ma dove è meglio mettere generare questa chiave, notando che le mie tavole sono sempre andando a cambiare come la mia soluzione si sviluppa e quindi mi sono rigenerare il mio Linq to Sql modello quando lo fa.

La stessa soluzione si applica per una colonna per contenere corrente datetime (dell'inserto), che verrebbe aggiornata con ogni aggiornamento?

È stato utile?

Soluzione

Come si è notato nel proprietario di Post è possibile utilizzare i metodi di estensibilità. L'aggiunta al tuo post si può guardare i metodi parziali creati nel DataContext per l'inserimento e l'aggiornamento di ogni tabella. Esempio con una tabella denominata "test" e una -column "CHANGEDATE":

partial void InsertTest(Test instance)
{
    instance.idCol = System.Guid.NewGuid();
    this.ExecuteDynamicInsert(instance);
}

partial void UpdateTest(Test instance)
{
    instance.changeDate = DateTime.Now;
    this.ExecuteDynamicUpdate(instance);
}

Altri suggerimenti

Grazie, ho provato questo fuori e sembra funzionare bene.  Ho un altro approccio, che penso userò per i GUID: valore predefinito SQLServer a NEWID (), poi nel generato automaticamente proprietà di valore LinqToSql impostata su true. Questo deve essere fatto su ogni generazione del modello, ma questo è abbastanza semplice.

Ci sono due cose che puoi fare:

  • o solo generare il GUID nel codice C # lato client e utilizzare tale valore
  • creare un vincolo DEFAULT sulla colonna di GUID in SQL Server che il default è newid() per la colonna - SQL Server farà in modo di aggiungere sempre un default - a meno che non si specifica un valore da soli

Per quanto riguarda la data di auto-aggiornamento / colonne tempo - qui probabilmente si deve utilizzare la logica lato client per farlo, o se si vuole farlo su SQL Server, si dovrà scrivere un trigger. Questo è davvero l'unico modo per aggiornare una specifica ogni colonna della riga viene aggiornato - non c'è alcun vincolo "autoupdate" o qualcosa di simile (e il vincolo di default funzionano solo su inserti, non aggiornamenti)

.

Qualcosa di simile potrebbe funzionare:

CREATE TRIGGER TRG_UpdateDateTimestamp
ON (your table name)
AFTER UPDATE 
AS
    IF NOT UPDATE(DateTimeStamp)
    BEGIN
       UPDATE (yourtablename) 
       SET DateTimeStamp = GETDATE()
       WHERE EXISTS (SELECT * FROM inserted AS i 
                     WHERE i.OID = (yourtable).OID)
   END

Marc

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