Dela via


Anvisningar: Ta bort rader från databasen

Du kan ta bort rader i en databas genom att ta bort motsvarande LINQ till SQL-objekt från deras tabellrelaterade samling. LINQ till SQL översätter dina ändringar till lämpliga SQL-kommandon DELETE .

LINQ till SQL stöder inte eller känner igen åtgärder för borttagning av kaskad. Om du vill ta bort en rad i en tabell som har begränsningar mot den måste du utföra någon av följande uppgifter:

  • ON DELETE CASCADE Ange regeln i villkoret sekundärnyckel i databasen.

  • Använd din egen kod för att först ta bort underordnade objekt som förhindrar att det överordnade objektet tas bort.

Annars utlöses ett undantag. Se det andra kodexemplet senare i det här avsnittet.

Kommentar

Du kan åsidosätta LINQ till SQL-standardmetoder för Insert, Updateoch Delete databasåtgärder. Mer information finns i Anpassa infognings-, uppdaterings- och borttagningsåtgärder.

Utvecklare som använder Visual Studio kan använda Object Relational Designer för att utveckla lagrade procedurer i samma syfte.

Följande steg förutsätter att en giltig DataContext ansluter dig till Northwind-databasen. Mer information finns i Så här: Anslut till en databas.

Ta bort en rad i databasen

  1. Fråga databasen om att raden ska tas bort.

  2. DeleteOnSubmit Anropa metoden.

  3. Skicka ändringen till databasen.

Exempel 1

Det första kodexemplet frågar databasen efter orderinformation som tillhör Order #11000, markerar orderinformationen för borttagning och skickar ändringarna till databasen.

// 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

Exempel 2

I det andra exemplet är målet att ta bort en order (#10250). Koden undersöker OrderDetails först tabellen för att se om ordningen som ska tas bort har underordnade där. Om ordern har underordnade, markeras först underordnade och sedan beställningen för borttagning. DataContext Placerar de faktiska borttagningarna i rätt ordning så att borttagningskommandon som skickas till databasen följer databasbegränsningarna.

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("{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();
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()

Se även