Partager via


Procédure : supprimer des lignes de la base de données (LINQ to SQL)

Mise à jour : November 2007

Vous pouvez supprimer des lignes d'une base de données en supprimant les objets LINQ to SQL correspondants de leur collection liée à des tables. LINQ to SQL traduit vos modifications en commandes DELETE SQL appropriées.

LINQ to SQL ne prend pas en charge ni ne reconnaît les opérations de suppression en cascade. Si vous souhaitez supprimer une ligne dans une table comportant des contraintes sur cette suppression, vous devez terminer l'une des tâches suivantes :

  • Définissez la règle ON DELETE CASCADE dans la contrainte de clé étrangère dans la base de données.

  • Utilisez votre propre code pour supprimer en premier les objets enfants qui empêchent la suppression de l'objet parent.

Sinon, une exception est levée. Consultez le second exemple de code décrit plus loin dans cette rubrique.

Remarque :

Vous pouvez substituer des méthodes par défaut LINQ to SQL pour les opérations Insert, Update et Delete sur les bases de données. Pour plus d'informations, consultez Personnalisation des opérations d'insertion, de mise à jour et de suppression (LINQ to SQL).

Les développeurs qui utilisent Visual Studio peuvent développer des procédures stockées dans le même but à l'aide du Concepteur Objet/Relationnel.

Les étapes suivantes supposent qu'un DataContext valide vous connecte à la base de données Northwind. Pour plus d'informations, consultez Procédure : se connecter à une base de données (LINQ to SQL).

Pour supprimer une ligne de la base de données

  1. Interrogez la base de données concernant la ligne à supprimer.

  2. Appelez la méthode DeleteOnSubmit.

  3. Soumettez la modification à la base de données.

Exemple

Le premier exemple de code interroge la base de données à propos de détails de commande concernant la commande 11000, marque ces détails de commande pour suppression, et soumet ces modifications à la base de données.

' Query the database for the rows to be deleted.
Dim deleteOrderDetails = _
    From details In db.OrderDetails() _
    Where details.OrderID = 11000 _
    Select details

For Each detail As OrderDetail In deleteOrderDetails
    db.OrderDetails.DeleteOnSubmit(detail)
Next

Try
    db.SubmitChanges()
Catch ex As Exception
    Console.WriteLine(ex)
    ' Provide for exceptions
End Try
// Query the database for the rows to be deleted.
var deleteOrderDetails =
    from details in db.OrderDetails
    where details.OrderID == 11000
    select details;

foreach (var detail in deleteOrderDetails)
{
    db.OrderDetails.DeleteOnSubmit(detail);
}

try
{
    db.SubmitChanges();
}
catch (Exception e)
{
    Console.WriteLine(e);
    // Provide for exceptions.
}

Dans ce second exemple, l'objectif est de supprimer une commande (10250). Le code commence par examiner la table OrderDetails pour voir si la commande à supprimer y a des enfants. Si la commande a des enfants, ces enfants sont marqués en vue de leur suppression, puis c'est au tour de la commande. Le DataContext place les véritables suppressions dans l'ordre approprié afin que les commandes de suppression envoyées à la base de données se conforment aux contraintes de la base de données.

Dim db As New Northwnd("c:\northwnd.mdf")

db.Log = Console.Out
' Specify order to be removed from database.
Dim reqOrder As Integer = 10252

' Fetch OrderDetails for requested order.
Dim ordDetailQuery = _
From odq In db.OrderDetails _
Where odq.OrderID = reqOrder _
Select odq

For Each selectedDetail As OrderDetail In ordDetailQuery
    Console.WriteLine(selectedDetail.Product.ProductID)
    db.OrderDetails.DeleteOnSubmit(selectedDetail)
Next

' Display progress.
Console.WriteLine("Detail section finished.")
Console.ReadLine()

' Determine from Detail collection whether parent exists.
If ordDetailQuery.Any Then
    Console.WriteLine("The parent is present in the Orders collection.")
    ' Fetch order.
    Try
        Dim ordFetch = _
        (From ofetch In db.Orders _
        Where ofetch.OrderID = reqOrder _
        Select ofetch).First()

        db.Orders.DeleteOnSubmit(ordFetch)
        Console.WriteLine("{0} OrderID is marked for deletion.,", ordFetch.OrderID)

    Catch ex As Exception
        Console.WriteLine(ex.Message)
        Console.ReadLine()
    End Try

Else
    Console.WriteLine("There was no parent in the Orders collection.")

End If


' Display progress.
Console.WriteLine("Order section finished.")
Console.ReadLine()

Try
    db.SubmitChanges()

Catch ex As Exception
    Console.WriteLine(ex.Message)
    Console.ReadLine()

End Try

' Display progress.
Console.WriteLine("Submit finished.")
Console.ReadLine()
Northwnd db = new Northwnd(@"c:\northwnd.mdf");

db.Log = Console.Out;

// Specify order to be removed from database
int reqOrder = 10250;

// Fetch OrderDetails for requested order.
var ordDetailQuery =
    from odq in db.OrderDetails
    where odq.OrderID == reqOrder
    select odq;

foreach (var selectedDetail in ordDetailQuery)
{
    Console.WriteLine(selectedDetail.Product.ProductID);
    db.OrderDetails.DeleteOnSubmit(selectedDetail);
}

// Display progress.
Console.WriteLine("detail section finished.");
Console.ReadLine();

// Determine from Detail collection whether parent exists.
if (ordDetailQuery.Any())
{
    Console.WriteLine("The parent is presesnt in the Orders collection.");
    // Fetch Order.
    try
    {
        var ordFetch =
            (from ofetch in db.Orders
             where ofetch.OrderID == reqOrder
             select ofetch).First();
        db.Orders.DeleteOnSubmit(ordFetch);
        Console.WriteLine("{0} OrderID is marked for deletion.", ordFetch.OrderID);
    }
    catch (Exception e)
    {
        Console.WriteLine(e.Message);
        Console.ReadLine();
    }
}
else
{
    Console.WriteLine("There was no parent in the Orders collection.");
}


// Display progress.
Console.WriteLine("Order section finished.");
Console.ReadLine();

try
{
    db.SubmitChanges();
}
catch (Exception e)
{
    Console.WriteLine(e.Message);
    Console.ReadLine();
}

// Display progress.
Console.WriteLine("Submit finished.");
Console.ReadLine();

Voir aussi

Tâches

Procédure : assigner des procédures stockées pour effectuer des mises à jour, des insertions et des suppressions (Concepteur O/R)

Autres ressources

Procédure : gérer les conflits de changement (LINQ to SQL)

Apport et soumission de modifications de données (LINQ to SQL)