2009-05-28 7 views
2

J'ai une relation parent-enfant très similaire à Northwind Customer/Orders mais avec une différence, la CustomerID dans la table Orders ne peut pas accepter NULL, c'est un FK, le enfant a une colonne PKey appelé OrderIDLINQ to SQL: Supprimer une nouvelle entité enfant ajoutée avant submitchanges - échoue

J'utilise ce modèle dans une fenêtre forme databinding, zone supérieure est d'avoir les informations des clients dans les zones de texte, zone inférieure est d'avoir une grille avec des commandes figurant

Je récupère un client en utilisant LINQ à partir de DB pour permettre à l'utilisateur de modifier les informations client ou les détails de la commande, lorsque je supprime une ligne de la grille de commande puis soumettre les modifications, je reçois erreur "Une tentative a été faite pour supprimer un relation entre un client et des commandes, cependant, une clé étrangère de la relation (CustomerID) ne peut pas être définie sur Null "

après une longue recherche sur Internet, j'ai utilisé l'attribut DeleteOnNull = True et cela fonctionne maintenant

ce qui ne fonctionne pas, cependant, et donnent toujours la même erreur exacte est quand j'ajouter un nouvel ordre sur la grille puis le supprimer avant SubmitChanges

Je comprends que lorsque je supprime une nouvelle ligne de commande dans la grille i supprimer uniquement les association au client, donc il définit CustomerID = NULL pour cette entité, bien, maintenant comment le retirer complètement de l'ensemble d'entités avant de soumettre les modifications pour éviter l'erreur, je ne peux pas utiliser DeleteOnSubmit parce que c'est une nouvelle entité qui ne vient pas de db, je recevrai une exception si j'essayais, donc supprimer la ligne à la main en utilisant la grille ne marche pas, ce qui appelle la méthode "Remove" et je ne peux pas utiliser DeleteOnSubmit, Que puis-je faire ?

pourquoi il doit être si difficile? à ADO.NET datatable est beaucoup plus facile, si je supprime une ligne et il arrive à venir de DB puis il marque pour la suppression, si c'est une nouvelle ligne, puis il supprime de la collection, Fait! Je ne veux pas revenir à datasets après avoir investi beaucoup d'efforts d'apprentissage LINQ to SQL maintenant

toute aide est très appréciée

Merci Bassam

+0

Pouvez-vous me dire si vous utilisez une application WinForm ou une application Web? Vous avez de la difficulté à comprendre ce que vous faites lorsque vous ajoutez ou supprimez une ligne dans la grille de données Orders. – alextansc

+0

Bien que je crois que l'auteur mentionne qu'il utilise WinForms, j'ai la même situation dans ASP.NET MVC. J'ai un scénario où le classeur de modèle par défaut MVC crée une entité enfant que je (basé sur certaines conditions) souhaite ne pas avoir persisté à la base de données. Je ne souhaite pas qu'il existe en fait, mais c'est dans mon graphique d'objets. Si j'utilise ".Remove()" - par exemple Customer.Orders.RemoveAt (0) pour utiliser le schéma de l'auteur - alors il semble OK jusqu'à ce que je SubmitChanges, à quel point j'obtiens une erreur sur une clé étrangère qui ne peut pas être mettre à null .... – Funka

Répondre

2

J'ai découvert ce que le problème et l'a résolu. Je veux partager l'info ici si quelqu'un d'autre est d'avoir la même question

d'abord, je tiens à mentionner un fait important: Si Cascade Supprimer est activée dans la base de données, puis

DeleteOnNull:=True , DeleteRule:="CASCADE" 

sera automatiquement inséré dans le code derrière le fichier .dbml sans avoir besoin d'ajouter manuellement DeleteOnNull=True pour une association spécifique.

Le problème est, il y avait un autre FKey dans l'entité enfant pour le OrderType, qui est OrderTypeID. Je mets cette valeur comme ceci:

Dim NormalOrderType = (From ot in db.OrderTypes Where ot.OrderTypeID=1 Select ot).Single 
NewOrder.OrderType = NormalOrderType   
OrdersBindingSource.Add(NewOrder)  

Lorsqu'un utilisateur supprime un ordre de la grille pour un client spécifique, LINQ to SQL définit le CustomerID FKey à rien, rompre l'association à l'entité mère. MAIS, il ne pas mis OrderTypeID à RIEN, en gardant l'autre association active à l'entité OrderTypes.Avec une entité OrderType déjà chargée en mémoire, LINQ to SQL pensera que je veux toujours insérer l'entité enfant mais avec CustomerID=Nothing, et puisque cela n'est pas autorisé (à partir du fichier dbml, Nullable=False), il lèvera une exception avant qu'il essaie d'enregistrer en DB en premier lieu.

Ce problème est résolu en faisant ceci:

NewOrder.OrderType = NOTHING 

Cela supprime manuellement l'association pour l'autre FKey. Ensuite, en supprimant simplement l'entité enfant, LINQ to SQL l'ignorera lorsque submitChanges sera appelée.

Merci
Bassam Muhammad.

Questions connexes