2008-11-08 7 views
3

Ce que je voudrais faire est le suivant. J'ai une seule table, Products, contenant une clé privée ProductID. Au lieu d'avoir ProductID SQL Server incrémentation automatique sur des inserts, je veux augmenter dans la méthode partielle DataContext « InsertProduct »:Incrémenter automatiquement une clé primaire dans la méthode partielle "Insert" de LINQ to SQL DataContext

Partial Public Class MyDataContext 

    Private Sub InsertProduct(ByVal instance As Product) 

     Dim id As Integer = Me.Products.Max(Function(p As Product) p.ProductID) + 1 
     instance.ProductID = id 

     Me.ExecuteDynamicInsert(instance) 

    End Sub 

End Class 

Cependant, cela ne fonctionnera que lors de l'insertion de la première instance de produit. Lorsque vous tentez d'insérer une deuxième instance, l'identifiant récupéré est le même que pour la première,

Using context As New MyDataContext 

    Dim product1 As New Product 
    context.Products.InsertOnSubmit(product1) 
    context.SubmitChanges() 'This works 

    Dim product2 As New Product 
    context.Products.InsertOnSubmit(product2) 
    context.SubmitChanges() 'DuplicateKeyException 

End Using 

Suis-je manque quelque chose évidente ici? InsertProduct n'est pas déclaré comme une méthode partielle dans le code ci-dessus

Répondre

0

Est-ce une faute de frappe dans votre message ou avez-vous déclaré avec une signature différente que nécessaire et donc il n'est pas en cours d'exécution? [EDIT] Je ne suis pas un programmeur VB (j'utilise C#), mais je pense que votre code doit déclarer le code aussi partiel que dans le concepteur. C'est vrai en C#, de toute façon. InsertProduct est déclaré comme méthode partielle dans le fichier généré par le concepteur (MyDataClasses.designer.vb).

0

Il est exécuté, en fait, je peux insérer un point d'arrêt dans InsertProduct et observer tout fonctionne correctement pour product1. Pour product2, une exception est renvoyée par context.SubmitChanges() mais le point d'arrêt n'est pas atteint.

2

Je recommande vraiment de laisser SQL Server faire la numérotation incrémentale. L'approche ci-dessus, même si vous la faites fonctionner, échouerait sous charge dans un scénario multi-utilisateur où tous les deux obtiennent le même ID et essayent d'insérer le même.

Questions connexes