Condividi tramite


Procedura: Eliminare righe dal database

È possibile eliminare righe in un database rimuovendo gli oggetti LINQ to SQL corrispondenti dalla raccolta correlata alla tabella. LINQ to SQL converte le modifiche nei comandi sql DELETE appropriati.

LINQ to SQL non supporta o riconosce le operazioni di eliminazione a catena. Se si desidera eliminare una riga in una tabella con vincoli, è necessario completare una delle attività seguenti:

  • Impostare la regola ON DELETE CASCADE nel vincolo di chiave esterna nel database.

  • Usare il proprio codice per eliminare prima gli oggetti figlio che impediscono l'eliminazione dell'oggetto padre.

In caso contrario, viene generata un'eccezione. Vedere il secondo esempio di codice più avanti in questo argomento.

Nota

È possibile eseguire l'override dei metodi predefiniti di LINQ to SQL per le operazioni di database Insert, Updatee Delete. Per altre informazioni, vedere Personalizzazione di operazioni di inserimento, aggiornamento ed eliminazione.

Gli sviluppatori che usano Visual Studio possono usare la Progettazione Relazionale degli Oggetti per sviluppare stored procedure per lo stesso scopo.

I passaggi seguenti presuppongono che un DataContext valido si connetta al database Northwind. Per altre informazioni, vedere Procedura: Connettersi a un database.

Per eliminare una riga nel database

  1. Interrogare il database per individuare la riga da eliminare.

  2. Chiamare il metodo DeleteOnSubmit .

  3. Inviare la modifica al database.

Esempio 1

Questo primo esempio di codice esegue una query sul database per i dettagli dell'ordine che appartengono a Order #11000, contrassegna questi dettagli dell'ordine per l'eliminazione e invia queste modifiche al database.

// 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.
}
' 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

Esempio 2

In questo secondo esempio, l'obiettivo è rimuovere un ordine (#10250). Il codice esamina innanzitutto la tabella OrderDetails per verificare se ci sono elementi figli dell'ordine da rimuovere. Se l'ordine ha figli, prima i figli e poi l'ordine vengono contrassegnati per la rimozione. Il DataContext inserisce le eliminazioni effettive nell'ordine corretto in modo che i comandi di eliminazione inviati al database rispettino i vincoli del database.

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 present 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($"{ordFetch.OrderID} OrderID is marked for deletion.");
    }
    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();
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()

Vedere anche