Aracılığıyla paylaş


Nasıl yapılır: Veritabanından Satır Silme

Veritabanındaki satırları silmek için, tabloyla ilgili koleksiyonlarından SQL'e karşılık gelen LINQ nesnelerini kaldırabilirsiniz. LINQ to SQL değişikliklerinizi uygun SQL DELETE komutlarına çevirir.

LINQ to SQL, art arda silme işlemlerini desteklemez veya tanımaz. Tablonun üzerinde kısıtlamaları olan bir satırı silmek istiyorsanız, aşağıdaki görevlerden birini tamamlamanız gerekir:

  • veritabanındaki yabancı anahtar kısıtlamasında ON DELETE CASCADE kuralı ayarlayın.

  • Önce üst nesnenin silinmesini engelleyen alt nesneleri silmek için kendi kodunuzu kullanın.

Aksi takdirde, bir özel durum oluşturulur. Bu konunun devamında yer alan ikinci kod örneğine bakın.

Uyarı

Insert, Updateve Delete veritabanı işlemleri için LINQ'yi SQL varsayılan yöntemlerine geçersiz kılabilirsiniz. Daha fazla bilgi için bkz. Ekleme, Güncelleştirme ve Silme İşlemlerini Özelleştirme.

Visual Studio kullanan geliştiriciler, saklı yordamları aynı amaçla geliştirmek için Nesne İlişkisel Tasarımcısı'nı kullanabilir.

Aşağıdaki adımlarda, geçerli bir DataContext sizi Northwind veritabanına bağladığını varsayalım. Daha fazla bilgi için bkz. Nasıl yapılır: Veritabanına bağlanma.

Veritabanındaki bir satırı silmek için

  1. Silinecek satırın veritabanını sorgular.

  2. yöntemini çağırın DeleteOnSubmit .

  3. Değişikliği veritabanına gönderin.

Örnek 1

Bu ilk kod örneği, Sipariş #11000'e ait sipariş ayrıntıları için veritabanını sorgular, bu sipariş ayrıntılarını silinmek üzere işaretler ve bu değişiklikleri veritabanına gönderir.

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

Örnek 2

Bu ikinci örnekte amaç bir siparişi kaldırmaktır (#10250). Kod ilk olarak OrderDetails tablosunu inceleyerek kaldırılacak siparişin alt öğelerinin bulunup bulunmadığını gösterir. Siparişin alt öğeleri varsa, önce çocuklar ve sonra sipariş kaldırılmak üzere işaretlenir. DataContext, veritabanına gönderilen silme komutlarının veritabanı kısıtlamalarına uyması için gerçek silmeleri doğru sırada yerleştirir.

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()

Ayrıca bkz.