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