Comment auto-remplir la valeur par défaut de Sequential Guid

Installer

J'ai une colonne uniqueidentifier qui est définie comme la primary key avec une Default Value or Binding de (newsequentialid()) .

Ce qui fonctionne

Dans mon projet MVC, je peux utiliser des éléments tels que [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] et Property(t => t.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); pour permettre à SQL Server de prendre en charge et d'utiliser la Default Value or Binding spécifiée pour générer automatiquement un guide séquentiel, et cela fonctionne correctement.

Qu'est-ce qui ne fonctionne pas

Cependant, si j'écris du code en dehors de mon projet MVC, plus précisément dans LINQPad, un guide vide, par exemple 00000000-0000-0000-0000-000000000000 , est toujours inséré:

 Resources.InsertOnSubmit(new Resource()); SubmitChanges(); 

Je comprends que je peux écrire quelque chose comme ceci pour insert une valeur guidée randomisée: new Resource() { Id = Guid.NewGuid() } , mais j'ai besoin d'un guide séquentiel.

Pourquoi je suis confus

J'avais l'printing que lorsqu'une valeur nulle ou vide était transmise à une colonne SQL Server, la Default Value or Binding , si elle était spécifiée, serait automatiquement utilisée.

Question 1:

Pourquoi la Default Value or Binding est-elle ignorée lors de l'utilisation de LINQPad?

Question 2:

Comment puis-je faire en sorte que SQL Server utilise la Default Value or Binding de (newsequentialid()) lorsque je n'ai pas access aux attributes MVC indiqués ci-dessus?

En ce qui concerne votre deuxième question, SQL Server ignorera la binding par défaut sur votre colonne si NULL est explicitement spécifié dans l'instruction d'insertion. De même, si votre projet MVC génère un Guid par défaut de 00000000-0000-0000-0000-000000000000 SQL Server inserta simplement la valeur dans votre table.

Une option consiste simplement à générer votre propre GUID séquentiel à partir de votre projet MVC. Il y a beaucoup d'exemples de générateurs GUID séquentiels en C #. Personnellement, j'aime la solution Alex Siepman pour GUID séquentiel, vous pouvez le find à l'location suivant: http://www.siepman.nl/blog/post/2015/06/20/SequentialGuid-Comb-Sql-Server-With-Creation- Date-Heure-.aspx

Vous pouvez également créer le triggersur INSTEAD OF INSERT sur votre table cible pour gérer correctement l'insertion de la manière souhaitée. Dans votre cas, vous voulez omettre l'ID transmis à la table et laisser SQL Server générer l'ID pour vous. Le triggersur ressemblera à ceci:

 CREATE TRIGGER AutoGuid_Trigger ON [dbo].[YourTableName] INSTEAD OF INSERT AS BEGIN INSERT INTO [dbo].[YourTableName] ( -- Exclude ID from column list, SQL Server will generate the ID [YourCol1] ,[YourCol2] ,[YourCol3] ,... ) SELECT [YourCol1] ,[YourCol2] ,[YourCol3] ,... FROM inserted END