En utilisant des colonnes de date de UNIQUEIDENTIFIER / mises à jour SqlServer avec LINQ to Sql - meilleure approche

StackOverflow https://stackoverflow.com/questions/925034

Question

tort ou à raison, je suis en utilisant l'identificateur unique comme clé primaire pour les tables dans ma base de données SQL Server. Je généré un modèle en utilisant LINQ to SQL (c #), mais où, dans le cas d'une colonne de identity LINQ to SQL génère une clé unique sur l'insertion d'un nouvel enregistrement pour guid / uniqueidentifier la valeur par défaut de 00000000-0000-0000-0000-000000000000.

Je sais que je peux régler le Guid dans mon code: dans le LINQ au modèle sql ou ailleurs, ou il y a la valeur par défaut dans la création de la table de serveur SQL (bien que cela est remplacée par la valeur générée dans le code). Mais où est préférable de mettre générer cette clé, en notant que mes tables vont toujours changer à mesure que ma solution se développe et donc je vais régénérer mon modèle à Sql quand Linq il le fait.

La même solution pour appliquer une colonne pour tenir datetime courant (de l'insert), qui serait mis à jour à chaque mise à jour?

Était-ce utile?

La solution

Comme vous l'avez noté dans votre propre poste, vous pouvez utiliser les méthodes d'extensibilité. Ajout à votre poste, vous pouvez regarder les méthodes partielles créées dans le DataContext pour l'insertion et la mise à jour de chaque table. Exemple avec une table appelée "test" et un "CHANGEDATE" -column:

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);
}

Autres conseils

Merci, je l'ai essayé cela et il semble fonctionner OK.  J'ai une autre approche, que je pense que je vais utiliser pour GUIDs: SQLServer valeur par défaut à newID (), puis à LinqToSql définir la propriété de valeur générée automatiquement à true. Cela doit être fait à chaque génération du modèle, mais cela est assez simple.

Il y a deux choses que vous pouvez faire:

  • soit juste générer le GUID dans votre code C # côté client et utiliser cette valeur
  • créer une contrainte DEFAULT sur la colonne GUID dans SQL Server par défaut newid() pour la colonne - le serveur SQL assurez-vous d'ajouter toujours une valeur par défaut - sauf si vous spécifiez une valeur vous

En ce qui concerne les colonnes de date / heure d'auto-mise à jour - là, vous avez sans doute d'utiliser soit logique côté client de le faire, ou si vous voulez le faire sur SQL Server, vous devez écrire un déclencheur. C'est vraiment la seule façon de mettre à jour une colonne spécifique à chaque fois de la ligne est mise à jour - il n'y a pas de contrainte ou de quoi que ce soit « autoupdate » comme celui-ci (et la contrainte par défaut ne fonctionne sur INSERTs, non mises à jour)

.

Quelque chose comme cela pourrait fonctionner:

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top